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

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

134 голоса | спросил Blake 24 AM00000010000005831 2010, 01:49:58

16 ответов


158

Использование широкого определения «файла»

ls | wc -l

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

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

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

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

find .//. ! -name . -print | grep -c //
ответил James Roth 24 AM00000010000000831 2010, 01:56:08
26

Для узкого (надеюсь) определения файла:

 find -maxdepth 1 -type f | wc -l
ответил Maciej Piechotka 24 AM00000030000002331 2010, 03:01:23
10
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 - <номер-1> | wc - <letter-l>

ответил nicomen 24 AM00000040000005331 2010, 04:57:53
5

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

set -- *; echo "$#"

Это, очевидно, обобщается на любой глобус.

В сценарии это имеет иногда неудачный побочный эффект перезаписи позиционных параметров. Вы можете обойти это, используя подоболочку или с функцией (версия 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, может потерпеть неудачу с слишком длинным аргументом списка , если имеется много подходящих файлов.

ответил Gilles 24 AM00000030000002831 2010, 03:26:28
5

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

ls -Aq | wc -l

, если вы хотите подсчитать файлы точек и

ls -q | wc -l

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

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

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

(поведение ls, проверенное с помощью coreutils 8.23)

ответил Frax 13 MaramFri, 13 Mar 2015 00:35:52 +03002015-03-13T00:35:52+03:0012 2015, 00:35:52
3

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

ls -AqU | wc -l
ответил Jbnair 22 +03002015-10-22T11:03:56+03:00312015bEurope/MoscowThu, 22 Oct 2015 11:03:56 +0300 2015, 11:03:56
2

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

tree

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

tree -a

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

sudo apt-get install tree

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

ответил lev 19 FriEurope/Moscow2014-12-19T13:05:34+03:00Europe/Moscow12bEurope/MoscowFri, 19 Dec 2014 13:05:34 +0300 2014, 13:05:34
2
find -maxdepth 1 -type f -printf . | wc -c
  • -maxdepth 1 сделает его нерекурсивным, find является рекурсивным по умолчанию
  • -type f будет включать только файлы
  • -printf . - симпатичный штрих. он печатает точку для каждого файла вместо имени файла, и теперь он способен обрабатывать любое имя файла, а также сохраняет данные; нам просто нужно подсчитать точки:)
  • | wc -c подсчитывает символы
ответил aude 30 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowFri, 30 Sep 2016 16:07:20 +0300 2016, 16:07:20
1

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

 $ fcount() { local f i=0; for f in *; do let i++; done; echo $i; }; fcount
ответил DaboD 18 Jpm1000000pmSun, 18 Jan 2015 18:28:15 +030015 2015, 18:28:15
1

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

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

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

ответил Dennis Williamson 24 AM00000050000002731 2010, 05:16:27
1
find . -type f -maxdepth 1 |  wc -l 

Это может отображать только файлы в текущем каталоге.

ответил pappu 16 J0000006Europe/Moscow 2016, 23:13:58
1

Я нашел du --inodes полезным, но я не уверен, какая версия du требуется. На Ubuntu 17.10 выполняются следующие работы:

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

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

ответил krlmlr 17 J0000006Europe/Moscow 2018, 19:55:55
0

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

echo $((`ls -l | wc -l` -1 ))
ответил Tiger 1 MarpmTue, 01 Mar 2016 22:13:29 +03002016-03-01T22:13:29+03:0010 2016, 22:13:29
0

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

ls -l | grep -v ^l | wc -l
ответил AMIC MING 26 AMpTue, 26 Apr 2016 01:05:49 +030005Tuesday 2016, 01:05:49
0

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

$ 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

Затем, как насчет запроса количества каталогов?

ответил jonaprieto 3 FebruaryEurope/MoscowbFri, 03 Feb 2017 00:20:22 +0300000000amFri, 03 Feb 2017 00:20:22 +030017 2017, 00:20:22
-2

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

tree
ответил user115186 13 Maypm15 2015, 12:22:52

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132