Рекурсивный просмотр каталога linux

Обновлено: 07.07.2024

как рекурсивно подсчитывать файлы в каталоге Linux?

Я нашел вот это:

но когда я запускаю это, он возвращает следующую ошибку.

find: пути должны предшествовать выражению:/

это должно работать:

объяснение:

  • -type f включить только файлы.
  • | (, а не ¦ ) перенаправляет find стандартный вывод команды в wc стандартный ввод команды.
  • wc (сокращенно от word count) подсчитывает новые строки, слова и байты на своем входе (docs).
  • -l считать только новая строка.

Примечания:

  • заменить DIR_NAME С . для выполнения команды в текущей папке.
  • вы также можете удалить -type f включить каталоги (и симлинки) в кол.
  • возможно, эта команда будет пересчитана, если имена файлов могут содержать символы новой строки.

объяснение, почему ваш пример не работает:

для текущего каталога:

Если вы хотите разбивку, сколько файлов в каждом каталоге под вашим текущим dir:

что может пойти все на одной линии, конечно. Скобки уточняют, чей вывод wc -l должен смотреть ( find $i -type f в данном случае).

после установки дерево пакета с

(на машине Debian / Mint / Ubuntu Linux).

команда показывает не только количество файлов, но и количество каталогов, отдельно. Параметр-L можно использовать для указания максимального уровня отображения (который по умолчанию является максимальной глубиной дерева каталогов).

скрытые файлы могут быть включены также, поставляя -a выбор.

на моем компьютере, rsync немного быстрее, чем find | wc -l в принятом ответе. Например, вы можете подсчитать файлы в /Users/joe/ такой:

вторая строка имеет количество файлов, 150,481 в приведенном выше примере. В качестве бонуса вы получаете общий размер (в байтах).

  • первая строка-это количество файлов, каталогов, символических ссылок и т. д. Все вместе, поэтому она больше, чем вторая линия.
  • на --dry-run (или -n для краткости) опция важна, чтобы на самом деле не передавать файлы!
  • на /xxx параметром может быть любая пустая или несуществующая папка. Не используйте / здесь.
  • я использовал -x опция "не пересекать границы файловой системы", что означает, если вы выполняете ее для / и у вас есть внешние жесткие диски, он будет считать только файлы на корневом разделе.

Он может обрабатывать нечетные вещи, такие как имена файлов, которые включают скобки пробелов и даже новые строки. Он также сортирует выходные данные по количеству файлов.

вы можете увеличить число после-maxdepth, чтобы подсчитать подкаталоги. Имейте в виду, что это может занять много времени, особенно если у вас сильно вложенная структура каталога в сочетании с высокой -maxdepth с номером.

Если вы хотите знать, сколько файлов и подкаталогов существует из настоящего рабочего каталога, вы можете использовать этот однострочный

Это будет работать в GNU flavour и просто опустить-e из команды echo для BSD linux (например, OSX).

если вы хотите избежать случаев ошибок, не позволяйте wc -l чтобы увидеть файлы с новыми строками (которые будут считаться 2+ файлами)

например, рассмотрим случай, когда у нас есть один файл с одним символом EOL в нем

по крайней мере, с gnu wc не похоже, что у вас есть возможность читать / считать список с нулевым завершением (кроме файла), самым простым решением было бы просто не передавать его имена файлов, но статический вывод каждый раз, когда файл найден, например, в том же каталог как выше

или если ваш find поддерживает

поскольку имена файлов в UNIX могут содержать новые строки (да, новые строки), wc -l может слишком много файлов. Я бы напечатал точку для каждого файла, а затем подсчитал точки:

чтобы определить, сколько файлов есть в текущем каталоге, поместить в ls -1 | wc -l . Это использует wc сделать подсчет количества строк (-l) производства ls -1 . Это не считается dotfiles. Обратите внимание, что ls -l (это "L", а не" 1", как в предыдущих примерах), который я использовал в предыдущих версиях этого HOWTO, фактически даст вам количество файлов на один больше, чем фактическое количество. Спасибо Кам Неджаду за это.

если вы хотите считать только файлы и не включают символические ссылки (просто пример того, что еще вы могли бы сделать), вы можете использовать ls -l | grep -v ^l | wc -l (это "L", а не" 1 "на этот раз, мы хотим" длинный " список здесь). grep проверяет наличие любой строки, начинающейся с " l " (с указанием ссылки), и отбрасывает эту строку (- v).

относительная скорость: "ls -1 / usr/ bin | /wc-l" занимает около 1,03 секунды на выгруженном 486SX25 (/usr/ bin / на этой машине имеет 355 файлов). " ls -l /usr/bin/ | grep -v ^l | wc -l " занимает около 1.19 секунды.

вы можете использовать команду ncdu . Он будет рекурсивно подсчитывать, сколько файлов содержит каталог Linux. Вот пример вывода:

enter image description here

Он имеет индикатор выполнения, что удобно, если у вас есть много файлов:

чтобы установить его на Ubuntu:

  • find . -type f | wc -l : около 1m20s для завершения
  • ncdu : около 1m20s для завершения

Я написал ffcnt для ускорения рекурсивного подсчета файлов при определенных обстоятельствах: вращающиеся диски и файловые системы, поддерживающие отображение экстента.

Он может быть на порядок быстрее, чем ls или find подходы, но YMMV.

Ok, который не рекурсивно подсчитывает файлы, но я хотел сначала показать простой вариант. Распространенным вариантом использования может быть создание резервных копий файла с опрокидыванием. Это создаст файл журнала.1, logfile.2, logfile.3 и т. д.

чтобы получить количество файлов рекурсивно, мы все еще можем использовать find таким же образом.

здесь . - Это папка для просмотра и 10 - количество символов, для группы справочника.

Иногда возникает путаница между опциями -r и -R, каждая из которых в разных программах может означать рекурсивную обработку файлов в найденных каталогах. А может означать нечто совершенно противоположное или работать не так, как этого ожидал пользователь. Попробуем разобраться, в каких случаях что используется.

Эпиграф

— Это новый «Гарри Поттер». Я заказал версии для детей и взрослых, чтобы проверить, что в тексте нет различий.
Морис Мосс, The IT Crowd.

chmod

Ключ -r у chmod интерпретируется как «запретить всем чтение файла», а 755 в данном случае рассматривается как название файла, у которого изменяются права. Поскольку в подавляющем большинстве случаев файла с таким названием в текущей директории отсутствует, то команда возвращает ошибку.

chown, chattr, chgrp

У вышеперечисленных команд опция -r просто отсутствует. Для рекурсивной обработки директорий необходимо использовать опцию -R. Очевидно, так сделано из солидарности с «братской» командой chmod

Несмотря на то, что в странице документации cp из GNU coreutils сказано, что опции -r и -R равнозначны и означают рекурсивную обработку встречающихся директорий, опция -r, в отличие от -R, не соответствует стандарту POSIX и ее указание может повлечь за собой неожиданные последствия в случае, если очередной копируемый объект является чем-то отличным от обычного файла или директории (например, символической ссылкой, fifo или сокетом). В таких случаях некоторые реализации cp просто копируют содержимое ссылки/fifo, тогда как при -R такие объекты пересоздаются заново. Раньше такое поведение было присуще GNU cp, о чем до сих пор имеется свидетельство в русском man cp. Что касается более правильных (чем Linux) систем, то, например, в BSD-версии cp опция -r работает в «режиме совместимости», т.е. не создает символическую ссылку заново, а копирует содержимое в файл с тем же именем.

Ключ -r команды ls означает «обратный порядок сортировки»
Правильно:

rm, grep

Зато в следующих случаях употребление -r/-R равнозначно:

Что касается grep, то, во-первых, обе опции не соответствуют POSIX (но, похоже, присутствуют во всех реализациях) Во-вторых, иногда возникает путаница между опциями -i (игнорировать регистр) и -I (пропускать двоичные файлы). Но это уже тема для другого разговора :)

Прочие команды

Поскольку команд, в том или ином виде поддерживающих рекурсивную обработку каталогов, набралось довольно много, то я попробовал свести их в одну таблицу.

команда -r -R
chacl рекурсия удаление ACL только с файлов
setfacl не поддерживается рекурсия
cvs номер ревизии рекурсия
diff рекурсия не поддерживается
gzip/gunzip рекурсия не поддерживается
zip рекурсия рекурсия, начиная с текущей директории (см. man zip, там есть существенная разница в обработке -r и -R)
rsync рекурсия использование относительных путей
wget рекурсия указывает список отвергаемых шаблонов

Заключение

Как видно, в большинстве случаев для указания рекурсии используется опция -r в нижнем регистре, в противовес стандартным утилитам, для которых характерно все же -R. Поэтому совет один: в случае сомнения смотрите в man, там все написано :)

Постскриптум

По абзацу про cp видно, что русская документация в некоторых дистрибутивах (не будем показывать пальцем на Debian и Ubuntu) не соответствует реальному положению дел. В частности, несмотря на то, что в jaunty используется GNU coreutis 6.10, русский man описывает cp версии 4.1. Желающие могут самостоятельно сравнить свою версию man 1 cp с локализованной. Другими словами, русская страница документации cp в силу своей древности вводит пользователя в заблуждение, т.е. врёт. По этой причине я рекомендую сделать apt-get remove manpages-ru.

2 комментария

    Comment by anon :

> По этой причине я рекомендую сделать apt-get remove manpages-ru

Плюсую. Помню как потерял с час времени, из за феерично переведенного мана:

If from is not NULL, and the underlying protocol provides the source address, this source address is filled in.

scp неплохо было бы упомянуть. Нигде проблем с -r/-R не испытывал, только в scp почему-то постоянно пишу -R.

Теперь, когда вы знаете как перемещаться по каталогам, пришло время взглянуть на содержимое этих каталогов.

Введите ls и нажмите [Enter] . Вы должны увидеть содержимое вашего текущего каталога или, как минимум, его часть.

Команда ls сама по себе не показывает всех файлов в вашем каталоге Чтобы увидеть всё, вы должны указать ещё один или два параметра.

Команда ls воспринимает множество параметров.

Прочитайте в man страницу команды ls

Если вы хотите увидеть все параметры команды ls , вы можете прочитать страницы руководства, выполнив в приглашении оболочки man ls . Если вы хотите распечатать страницу руководства, введите в приглашении man ls | col -b | lpr .

Зачем так много параметров? Все они помогают отсортировать информацию, так как вам это нужно. Например, вы можете указать как отображать файлы, показывать ли разрешения и многое другое.

Рисунок 10-6. ls с параметром -a

Введите ls -a . Теперь вы видите файлы, начинающиеся с точек. Такие файлы называются скрытыми.

Скрытые файлы чаще всего представляют собой конфигурационные файлы, задающие настройки для программ, оконных менеджеров, оболочек и т.д. Они сделаны скрытыми, чтобы предотвратить случайное их повреждение пользователем. Кроме этого, если вы ищете в каталоге что-то, обычно вас не интересуют эти конфигурационные файлы, а так как они скрыты, они не загромождают ваш экран.

Просматривая список файлов с помощью команды ( ls -a ) вы получаете много информации, но указав еще дополнительные параметры, вы сможете увидеть ещё больше.

Если вы хотите увидеть размер файла или каталога, время создания и другие сведения, просто добавьте параметр "long" (длинный) ( -l ) в команду ls -a :

Эта команда покажет дату создания файла, его размер, владельца, разрешения и т.д.

Вы не обязаны находиться в каталоге, содержимое которого вы просматриваете с помощью команды ls .

Посмотрите, что находится в каталоге /etc выполнив:

Вы получите массу информации о содержимом каталога /etc .

Ниже приводится список некоторых часто используемых параметров команды ls . Не забывайте о том, что вы можете получить полный список параметров в руководстве, на странице ls ( man ls ).

-a — all (все). Показывает все файлы в каталоге, включая скрытые файлы ( .filename ). Каталоги .. и . вверху этого списка обозначают родительский и текущий каталог соответственно.

-l — long (длинный). Выводит информацию о содержимом, включая разрешения (режимы), владельца, группу, размер, дату создания, является ли этот файл ссылкой на что-то другое в системе, и если да, то куда указывает эта ссылка.

-F — file type (тип файла). Добавляет в конце каждой строки определённый символ. Это может быть символ / , обозначающий каталог; @ , обозначающий ссылку на другой файл; и * , обозначающий исполняемый файл.

-r — reverse (обратный). Показывает содержимое каталога от конца к началу.

-R — recursive (рекурсивный). Этот параметр также показывает содержимое всех каталогов, вложенных в текущий.

-S — size (размер). Сортирует файлы по их размеру.

Чуть позже в этой главе, когда вы познакомитесь с перенаправлением ввода/вывода, вы откроете для себя другие способы просмотреть содержимое каталога.

Команда ls выводит список файлов и каталогов в файловой системе и показывает подробную информацию о них. Это часть пакета основных утилит GNU, который установлен во всех дистрибутивах Linux.

Эта статья покажет вам, как использовать команду ls, на практических примерах и подробных объяснениях наиболее распространенных параметров ls.

Как использовать команду ls

Синтаксис команды ls следующий:

При использовании без параметров и аргументов ls отображает список имен всех файлов в текущем рабочем каталоге :

Файлы перечислены в алфавитном порядке в столько столбцов, сколько может поместиться на вашем терминале:

Чтобы вывести список файлов в определенном каталоге, передайте путь к каталогу в качестве аргумента команде ls . Например, чтобы отобразить содержимое каталога /etc , введите:

Вы также можете передать несколько каталогов и файлов, разделенных пробелом:

У команды ls есть несколько опций. В следующих разделах мы рассмотрим наиболее часто используемые варианты.

Формат длинных списков

По умолчанию вывод команды ls показывает только имена файлов и каталогов, что не очень информативно.

Параметр -l (нижний регистр L) указывает ls печатать файлы в формате длинного списка.

Когда используется формат длинного списка, вы можете увидеть следующую информацию о файле:

  • Тип файла.
  • Права доступа к файлу.
  • Количество жестких ссылок на файл.
  • Владелец файла.
  • Файловая группа.
  • Размер файла.
  • Дата и время.
  • Имя файла.

Давайте объясним самые важные столбцы вывода.

Первый символ показывает тип файла. В этом примере первый символ - , что указывает на обычный файл. Значения для других типов файлов следующие:

Следующие два поля root root показывают владельца файла и группу, за которыми следует размер файла ( 337 ), показанный в байтах. Используйте параметр -h если вы хотите печатать размеры в удобочитаемом формате. Вы можете изменить владельца файла с помощью команды chown .

Показать скрытые файлы

Чтобы отобразить все файлы, включая скрытые, используйте параметр -a :

Сортировка вывода

Как мы уже упоминали, по умолчанию команда ls перечисляет файлы в алфавитном порядке.

Параметр --sort позволяет сортировать вывод по расширению, размеру, времени и версии:

Если вы хотите получить результаты в обратном порядке сортировки, используйте параметр -r .

Например, чтобы отсортировать файлы в каталоге /var по времени модификации в обратном порядке, вы должны использовать:

Стоит отметить, что команда ls не показывает общее пространство, занятое содержимым каталога. Чтобы узнать размер каталога , используйте команду du .

Рекурсивный список подкаталогов

Параметр -R указывает команде ls рекурсивно отображать содержимое подкаталогов:

Выводы

Команда ls отображает информацию о файлах и каталогах.

Для получения дополнительной информации о ls посетите страницу GNU Coreutils или введите man ls в свой терминал.

Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь оставлять комментарии.

Читайте также: