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

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

Комментарии к вопросу (2)
Решение

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

ls | wc -l

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

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

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

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

find .//. ! -name . -print | grep -c //
Комментарии (6)

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

 find . -maxdepth 1 -type f | wc -l
Комментарии (4)
ls -1 | wc -l

...

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

...

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

P. S.: Обратите внимание Общ -&ЛТ;номер один> | туалетом -&ЛТ;букву-Л>

Комментарии (6)

Возможно, наиболее полный ответ, используя пара ЛС/туалет - это

ls -Aq | wc -l

если вы хотите рассчитывать Dot-файлов, и

ls -q | wc -l

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

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

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

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

Комментарии (2)

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

set -- *; echo "$#"

Очевидно, что это можно обобщить на любой glob.

В сценарии это имеет иногда неприятный побочный эффект перезаписи позиционных параметров. Это можно обойти, используя вложенную оболочку или функцию (версия 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). Если glob - *, команда может быть сокращена до $(ls | wc -l). Парсинг вывода ls всегда вызывает у меня беспокойство, но здесь он должен работать, если только имена ваших файлов не содержат новых строк, или ваш ls их экранирует. А $(ls -d -- * 2>/dev/null | wc -l) имеет преимущество в том, что изящно обрабатывает случай несовпадения glob (т.е. возвращает 0 в этом случае, тогда как метод set * требует сложной проверки, если glob может быть пустым).

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

Любое из этих решений, основанное на передаче расширения glob в ls, может завершиться ошибкой argument list too long при большом количестве подходящих файлов.

Комментарии (6)

Я нашел дю --дескрипторы полезного, но я'м не знаете, какую версию " дю " она требует. Он должен быть существенно быстрее, чем альтернативные подходы, используянайтиитуалет`.

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

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

Совмещать с | сортировка -НР для сортировки по убыванию по количеству, содержащий индексные дескрипторы.

Комментарии (0)

При использовании пары Общ/туалетом, если мы добавляем -у него будет гораздо быстрее (не сортировать ).

ls -AqU | wc -l
Комментарии (1)

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

"дерево"

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

дерево -

Если вы используете Дебиан / Минт / Убунту Linux введите следующую команду для установки дерева команд:

судо apt-получить установку дерева

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

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

Нет трубы, нет строки копировать, без вилки, просто Баш один лайнер

$ fcount() { local f i=0; for f in *; do let i++; done; echo $i; }; fcount
Комментарии (1)

Здесь's и другую технику вдоль линии один запостил Жиль:

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

которая создает массив с 13,923 элементов (если это's сколько файлов есть).

Комментарии (1)
find . -type f -maxdepth 1 |  wc -l 

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

Комментарии (1)

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

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

Это спасает нас от испытание выходной парсинг команды ls.


Связанные:

Комментарии (0)

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

echo $((`ls -l | wc -l` -1 ))
Комментарии (0)

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

ls -l | grep -v ^l | wc -l
Комментарии (0)

Совершенствование некоторых ответов, прежде чем но на этот раз делает явно.

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

Это'ы достойны видеть использование ваши близкие команды, как хвост и резать. Также обратите внимание, что дерево не доступен по умолчанию. Команду над первым захватить информацию о каталоге 1-го уровня, тогда вам в последней строке хвоста -Н 1 где наша цель, и в конечном итоге с резать, чтобы занять третье слово.

Например, размещая в /:

/ $ 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)

Используйте команду дерево, просто:

tree
Комментарии (0)