У меня есть каталог с большим количеством файлов. Я не вижу ls
переключателя для подсчета. Есть ли какая-то магия командной строки, чтобы получить количество файлов?
command-line
Блейк
источник
источник
tree . | tail
илиtree -a . | tail
включить скрытые файлы / каталоги,tree
рекурсивно, если это то, что вы хотите.Ответы:
Используя широкое определение «файла»
(обратите внимание, что он не считает скрытые файлы и предполагает, что имена файлов не содержат символов новой строки).
Чтобы включить скрытые файлы (кроме
.
и..
) и избежать проблем с символами новой строки, каноническим способом является:Или рекурсивно:
источник
wc
программа для подсчета слов-l
Переключатель заставляет его считать строки. В этом случае он считает строки в выводе изls
. Так всегда меня учили подсчитывать количество файлов для данного каталога.ls
имеет место,ls -1
если вывод представляет собой трубу.ls -la
, вы получите три строки в каталоге. Вы хотитеls -lA | wc -l
пропустить.
и..
записи. Тем не менее, вы все равно будете в одиночестве.ls -q | wc -l
- хотя отмечают , что скрытые файлы все еще не будут подсчитаны этим подходом, и что каталоги будут учитываться.Для узкого определения файла:
источник
-maxdepth 1
рекурсивный подсчет файлов (или настроить его для желаемой максимальной глубины поиска).find -maxdepth 1 -type f -printf "\n" | wc -l
...
...
PS: Примечание ls - <номер-один> | туалет - <буква-л>
источник
ls
делают-1
автоматически, когда вывод в трубу.[[ -p /dev/stdin ]] && echo "stdin is from a pipe"
Вероятно, наиболее полный ответ с использованием
ls
/wc
парыесли вы хотите считать точечные файлы, и
в противном случае.
-A
это считать точечные файлы, но опустить.
и..
.-q
сделатьls
замену неграфических символов, в частности символа новой строки, с?
выводом 1 строки для каждого файлаЧтобы получить однострочный выход из
ls
терминала (т.е. без подключения к немуwc
),-1
необходимо добавить опцию.(поведение
ls
протестировано с coreutils 8.23)источник
-1
не нужно. Что касается «он обрабатывает переносы строк в именах файлов разумно с выводом на консоль» , то это из-за-q
переключателя (который вы должны использовать вместо того,-b
потому что он переносим), который «заставляет записывать каждый экземпляр непечатных символов имени файла и символов <tab> в качестве символа <вопросительный знак> ('?'). Реализации могут предоставлять эту опцию по умолчанию, если вывод осуществляется на терминальное устройство. " Например,ls -Aq | wc -l
чтобы подсчитать все файлы / каталоги илиls -qp | grep -c /
только не скрытые каталоги и т. Д.-b
на-q
.Если вы знаете, что текущий каталог содержит хотя бы один не скрытый файл:
Это очевидно обобщается на любой шар.
В сценарии это иногда вызывает нежелательный побочный эффект перезаписи позиционных параметров. Вы можете обойти это, используя subshell или с помощью функции (версия Bourne / POSIX), например:
Альтернативное решение есть
$(ls -d -- * | wc -l)
. Если глобус есть*
, команда может быть сокращена до$(ls | wc -l)
. Анализ выходных данныхls
всегда делает меня неловким, но здесь это должно работать до тех пор, пока ваши имена файлов не содержат символов новой строки или вы не можетеls
их избежать. И$(ls -d -- * 2>/dev/null | wc -l)
имеет преимущество в том, что изящно обрабатывает случай несовпадающего глобуса (т. Е. Возвращает 0 в этом случае, тогда какset *
метод требует тщательного тестирования, если глобус может быть пустым).Если имена файлов могут содержать символы новой строки, альтернативой является использование
$(ls -d ./* | grep -c /)
.Любое из тех решений, которые полагаются на передачу расширения глобуса,
ls
может завершиться ошибкой со слишком длинной ошибкой списка аргументов, если имеется много подходящих файлов.источник
local
или устранить ее:eval $1=$#
или просто использоватьecho $#
и делатьnumber_of_files=$(count_words *)
.$#
(вы не сделали этого до редактирования)?$1
. Так что я хочу посчитать количество параметров, которые не являются первым параметром. (Я не могу использовать,shift
потому что мне нужно держать имя переменной рядом.) (Хмм, теперь, если бы вы спросили о первой строке ...)shift
если у меня время правильно.Я нашел
du --inodes
полезным, но я не уверен, какая версияdu
этого требует. Это должно быть значительно быстрее, чем использование альтернативных подходовfind
иwc
.На Ubuntu 17.10 работает следующее:
Объединить с
| sort -nr
сортировать по убыванию по количеству содержащихся inode.источник
При использовании пары ls / wc, если мы добавим -U, это будет намного быстрее (не сортируйте).
источник
-U
хотя специфичен для GNU.После установки команды дерева, просто наберите:
tree
Если вы хотите скрытые файлы тоже:
tree -a
Если вы используете Debian / Mint / Ubuntu Linux, введите следующую команду, чтобы установить команду дерева:
sudo apt-get install tree
Опция -L используется для указания максимального уровня отображения дерева каталогов. Команда дерева не только подсчитывает количество файлов, но и количество каталогов, учитывая столько уровней дерева каталогов, сколько вам нужно.
источник
-maxdepth 1
сделает его нерекурсивным,find
по умолчанию рекурсивным-type f
будет включать только файлы-printf .
это милое прикосновение. он печатает точку для каждого файла вместо имени файла, и теперь он может обрабатывать любое имя файла, а также сохраняет данные; нам просто нужно посчитать точки :)| wc -c
считает символыисточник
Без трубы, без копирования строк, без форка
источник
Вот еще один прием, аналогичный тому, который опубликовал Жиль :
который создает массив с 13 923 элементами (если это количество файлов).
источник
c
массиве?word_count() { echo "$#"; }
было бы достаточно. Смысл решения @Gilles заключается в том, чтобы сохранить счетчик в возвращаемой переменной, чтобы избежать необходимости использовать подстановку команд (которая включает в себя разветвление и канал в оболочках, отличных от ksh93).Это может перечислить только файлы в текущем каталоге.
источник
find . -type f
найдет файлы в текущем каталоге, а также, рекурсивно, в подкаталогах.Попробуйте это, я надеюсь, что этот ответ поможет вам
источник
Вы можете проверить с помощью:
источник
Улучшение некоторых ответов, приведенных ранее, но на этот раз делать явно.
Стоит отметить использование некоторых любимых команд, таких как
tail
иcut
. Также обратите внимание, что дерево не доступно по умолчанию. Приведенная выше команда сначала собирает информацию о каталоге на уровне 1, затем получает последнюю строку, вtail -n 1
которой находится наша цель, и в итогеcut
получает третье слово.Например, найти в
/
:Тогда как насчет того, чтобы узнать количество каталогов?
источник
В Linux, чтобы сделать команду очень надежной и обрабатывать файлы, в имени которых могут быть символы новой строки, используйте это:
Это спасает нас от суровых испытаний при разборе
ls
.Связанный:
источник
Используйте
tree
команду, просто:источник