it-swarm-ru.tech

Как я могу получить количество файлов в каталоге с помощью командной строки?

У меня есть каталог с большим количеством файлов. Я не вижу переключателя ls для подсчета. Есть ли какая-то магия командной строки, чтобы получить количество файлов?

219
Blake

Используя широкое определение "файла"

ls | wc -l

(обратите внимание, что он не считает скрытые файлы и предполагает, что имена файлов не содержат символов новой строки).

Включить скрытые файлы (кроме . а также ..) и во избежание проблем с символами новой строки канонический путь:

find . ! -name . -Prune -print | grep -c /

Или рекурсивно:

find .//. ! -name . -print | grep -c //
279
James Roth

Для узкого определения файла:

 find . -maxdepth 1 -type f | wc -l
35
Maciej Piechotka
ls -1 | wc -l

...

$ ls --help | grep -- '  -1'
    -1                         list one file per line

...

$ wc --help | grep -- '  -l'
    -l, --lines            print the newline counts

PS: Примечание ls - <номер-один> | туалет - <буква-л>

15
nicomen

Я нашел du --inodes полезно, но я не уверен, какая версия du требуется. Он должен быть значительно быстрее, чем альтернативные подходы, использующие find и ​​wc.

На Ubuntu 17.10 работает следующее:

du --inodes      # all files and subdirectories
du --inodes -s   # summary
du --inodes -d 2 # depth 2 at most

Объединить с | sort -nr для сортировки по убыванию по количеству содержащихся inode.

12
krlmlr

Вероятно, наиболее полный ответ с использованием пары ls/wc

ls -Aq | wc -l

если вы хотите считать точечные файлы, и

ls -q | wc -l

в противном случае.

  • -A - считать точечные файлы, но пропустить . а также ...
  • -q make ls заменяет неграфические символы, особенно символы новой строки, на ?, выводя 1 строку для каждого файла

Чтобы получить однострочный вывод из ls в терминале (то есть без передачи его в wc), -1 опция должна быть добавлена.

(поведение ls протестировано с coreutils 8.23)

12
Frax

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

_set -- *; echo "$#"
_

Это очевидно обобщается на любой шар.

В сценарии это иногда вызывает нежелательный побочный эффект перезаписи позиционных параметров. Вы можете обойти это, используя subshell или с помощью функции (версия Bourne/POSIX), например:

_count_words () {
  eval 'shift; '"$1"'=$#'
}
count_words number_of_files *
echo "There are $number_of_files non-dot files in the current directory"
_

Альтернативное решение - $(ls -d -- * | wc -l). Если глобус _*_, команда может быть сокращена до $(ls | wc -l). Анализ выходных данных ls всегда делает меня неловким, но здесь это должно работать, пока ваши имена файлов не содержат символов новой строки или ваш ls избегает их. И $(ls -d -- * 2>/dev/null | wc -l) имеет то преимущество, что корректно обрабатывает случай несовпадающего глобуса (т. Е. Возвращает 0 в этом случае, тогда как метод _set *_ требует тщательного тестирования, если глобус может быть пустым) ,.

Если имена файлов могут содержать символы новой строки, альтернативой является использование $(ls -d ./* | grep -c /).

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

8
Gilles 'SO- stop being evil'

При использовании пары ls/wc, если мы добавим -U, это будет намного быстрее (не сортируйте).

ls -AqU | wc -l
5
Jbnair

После установки команды дерева, просто наберите:

tree

Если вы хотите скрытые файлы тоже:

tree -a

Если вы используете Debian/Mint/Ubuntu Linux, введите следующую команду, чтобы установить команду дерева:

Sudo apt-get install tree

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

4
lev
find -maxdepth 1 -type f -printf . | wc -c
  • -maxdepth 1 сделает его нерекурсивным, find по умолчанию рекурсивным
  • -type f будет включать только файлы
  • -printf . это приятное прикосновение. он печатает точку для каждого файла вместо имени файла, и теперь он может обрабатывать любое имя файла, а также сохраняет данные; нам просто нужно посчитать точки :)
  • | wc -c подсчитывает символы
3
aude

Без трубы, без копирования строк, без форка

$ fcount() { local f i=0; for f in *; do let i++; done; echo $i; }; fcount
1
DaboD

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

find -maxdepth 1 -type f -print0 | tr -cd '\0' | wc -c

Это спасает нас от ordeal анализа ls вывода.


Связанные с:

1
codeforester

Вот еще один прием по аналогии с один из опубликованных Жилем :

Word_count () { local c=("[email protected]"); echo "${#c[@]}"; }
file_count=$(Word_count *)

который создает массив с 13 923 элементами (если это количество файлов).

1
Paused until further notice.
find . -type f -maxdepth 1 |  wc -l 

Это может перечислить только файлы в текущем каталоге.

1
srpatch

Улучшение некоторых ответов, приведенных ранее, но на этот раз делать явно.

$ tree -L 1 | tail -n 1 | cut -d " " -f 3

Стоит отметить использование некоторых любимых команд, таких как tail и ​​cut. Также обратите внимание, что дерево не доступно по умолчанию. Команда выше сначала собирает информацию о каталоге на уровне 1, затем получает последнюю строку tail -n 1 где наша цель, и в конечном итоге cut, чтобы взять третье Слово.

Например, найти в /:

/ $ tree -L 1
.
├── 1
├── bin -> usr/bin
├── boot
├── dev
├── etc
├── home
├── lib -> usr/lib
├── lib64 -> usr/lib64
├── lost+found
├── media
├── mnt
├── opt
├── proc
├── root
├── run
├── sbin -> usr/sbin
├── srv
├── sys
├── tmp
├── usr
└── var

20 directories, 1 file
/ $ tree -L 1 | tail -n 1
20 directories, 1 file
/ $ tree -L 1 | tail -n 1 | cut -d " " -f 3
1

Тогда как насчет того, чтобы узнать количество каталогов?

0
jonaprieto

Попробуйте это, я надеюсь, что этот ответ поможет вам

echo $((`ls -l | wc -l` -1 ))
0
Tiger

Вы можете проверить с помощью:

ls -l | grep -v ^l | wc -l
0
AMIC MING