Рекурсивный просмотр каталога linux
как рекурсивно подсчитывать файлы в каталоге 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. Вот пример вывода:
Он имеет индикатор выполнения, что удобно, если у вас есть много файлов:
чтобы установить его на 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 воспринимает множество параметров.
Если вы хотите увидеть все параметры команды 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 в свой терминал.
Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь оставлять комментарии.
Читайте также:
- Pocket linux что это
- Как установить виндовс 10 с флешки на линукс
- Почему не скачиваются игры в стиме на windows 10
- Это приложение не будет установлено по соображениям безопасности windows 7 msi
- Как включить vpn в opera на linux