Подсчитайте общее количество файлов в определенном каталоге с определенным расширением

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

Я получаю следующую команду:

ls -F |grep -v / | wc -l

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

Есть ли для этого какая-нибудь команда Ubuntu?

К сожалению, эту доброкачественную проблему трудно решить способом, который поддерживает все имена файлов и является переносимым. Этот безопасен (он обрабатывает скрытые файлы, пути, содержащие пробелы, тире и даже новые строки) и совместимость с POSIX:

find /path/to/directory -mindepth 1 -type f -name "*.mp4" -printf x | wc -c

Если вы не хотите, чтобы он был рекурсивным, просто добавьте -maxdepth 1.

Вы не должны анализировать ls выход.

Тест:

$ cd -- "$(mktemp -d)"$ touch -- -foo.mp4 .bar.mp4 .bat.mp4 'baz.mp4> ban.mp4'$ find . -mindepth 1 -type f -name "*.mp4" -exec printf x \; | wc -c4

Сравните с принятый ответ:

$ ls -lR ./*.mp4 | wc -l3

Или другие предложения:

$ find . -name "*.mp4" | wc -l5$ ls -1 *.mp4 | wc -lls: invalid option -- '.'Try 'ls --help' for more information.0$ find . -name "*.mp4" | wc -c # Answer fixed at a later time51$ find . -name "*.mp4" | wc -l5$ find . | grep -i ".mp4$" | wc -l5$ ls . | grep ".mp4$" | wc -l3

Здесь вы можете сделать это следующим образом

ls -lR /path/to/dir/*.jpg | wc -l

Это дает вам подсчет

Этот находит, сортирует и перечисляет все файлы по расширению в порядке:

find . -type f | sed 's/.*\.//' | sort | uniq -c

Я думаю, что это очень просто, как следовать командам.

$ find . -name "*.mp4" | wc -l8

или

$ find . | grep -i ".mp4$" | wc -l8

Я думаю, что приведенные выше команды вычисляют количество имен файлов и каталогов *.mp4

поэтому я предлагаю вам использовать -type f вариант в качестве find параметр следующим образом.

$ find . -name "*.mp4" -type f | wc -l8

В дополнение, ls -lR может использоваться в качестве find .

Вы могли бы использовать ls -1 *.mp4 | wc -l.

Здесь будут перечислены все файлы, заканчивающиеся на .mp4, печатая каждый файл в новой строке (ls -1 *.mp4), передайте выходные данные в wc который будет подсчитывать количество новых строк, используя -l флаг.

В bash можно прибегнуть к использованию массивов с глобусом:

$ files=( *.mp4  )$ echo ${#files[@]}30

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

Например:

a=0; for i in ./*.jpg; do a=$(expr  $a + 1); done; echo $a 

Это должно дать вам список файлов с расширением .mp4

ls /path/to/directory | grep ".mp4$"

В сочетании с wc -l даст вам подсчет

ls /path/to/directory | grep ".mp4$" | wc -l

если вы хотите, чтобы поиск включал подкаталоги

ls -lR /path/to/directory | grep ".mp4$" | wc -l
ls | grep --count \.csv$

Замените (.csv на нужное вам расширение)

Пояснение: Я думаю, что простая схема заключается в извлечении списка файлов и подсчете расширения с помощью grep. \. совпадать . и $ чтобы соответствовать добавочному номеру в конце строки. Это работает, потому что при передаче выходных данных ls в каждой строке отправляется одно имя файла, которое вы можете проверить, выполнив:

ls | cat

Проверять Как Подсчитать Файлы По Расширению В Linux?, это дает хороший ответ и объяснение, вы можете использовать следующую команду:

find . -type f | sed -n 's/..*\.//p' | sort | uniq -c

Простой, правильный, прямой ответ - это @louis-matthijssen one. обработка символов новой строки ls -1 в этом случае делает разумным разбор выходных данных ls. Отмеченный является неправильным для использования флага -R.