Я хочу посчитать общее количество файлов в определенном каталоге, который заканчивается расширением ".mp4".
Я получаю следующую команду:
ls -F |grep -v / | wc -l
Он считает все файлы в определенном каталоге, но я хочу, чтобы количество файлов, которые заканчиваются расширением .mp4.
Есть ли какая-нибудь команда Ubuntu для этого?
command-line
ls
Пракаш В Холкар
источник
источник
ls -1
обработка символов новой строки делает, в этом случае, разумным анализироватьls
вывод. Помеченный является неправильным для использования флага -R.Ответы:
Здесь вы можете сделать это
Это дает вам счет
источник
-R
? Зачем делать полный,stat
когда вам просто нужно имя файла? Почему нетls -1 *.jpg| wc -l
? (хорошо, не работает, если у вас есть имена файлов с символами новой строки. В этом случае вы это заслужили ;-) ...).jpg
. Вы когда-нибудь проверяли это?*.jpg
он расширяется оболочкой, а не с помощьюls
) и если есть файлы, имена которых начинаются с дефиса..
. Но на самом деле все работает нормально с дефисами в именах, кроме случаев, когда/path/to/dir
пустая строка или относительный путь начинаются с дефиса. Но я был неправ, прежде чем сказать,ls
заменяет символы с?
. Это происходит, когда stdout является терминалом, но здесь вывод является каналом, поэтомуls
отправляет все символы из имен файлов вwc
. Это делает этот ответ неправильным без флага-q
или,-b
чтобы изменить это поведение , потому что имена файлов могут содержать символы новой строки. Ответ l0b0 свободен от этих проблем.К сожалению, эту сложную проблему трудно решить способом, который поддерживает все имена файлов и является переносимым. Это безопасно (оно обрабатывает скрытые файлы, пути, содержащие пробелы, тире и даже переводы строк)
и POSIX-совместимо:Если вы не хотите, чтобы он был рекурсивным, просто добавьте
-maxdepth 1
.Вы не должны анализировать
ls
вывод.Тест:
Сравните с принятым ответом :
Или другие предложения:
источник
-printf x
вместо-exec printf x \;
. То есть:find /path/to/directory -mindepth 1 -type f -name "*.mp4" -printf x | wc -c
нет необходимости-exec
во внешнейprintf
команде, которая, если есть много файлов, будет очень медленной , потому чтоfind
она должна форкнуть (2) свою копию и затем выполнить execve (2)/usr/bin/printf
. При этом-exec printf x \;
это должно быть сделано один раз для каждого файла .-printf
не поддерживается в POSIXfind
, поэтому я не использовал его.-mindepth
и-maxdepth
, которые вы использовали.find
содержит-mindepth
и-maxdepth
не содержит,-printf
поэтому я ценю включение обоих.Этот находит, сортирует и перечисляет все файлы по расширению в следующем порядке:
источник
| sort -rn
в конце и, возможно,-mindepth 1
просто текущий каталог.head -n
получить верх п.Я думаю, что это очень просто, как следующие команды.
или
Я думаю, что вышеупомянутые команды вычисляют количество имен файлов и каталогов
*.mp4
поэтому я предлагаю вам использовать
-type f
опцию в качествеfind
параметра следующим образом.Кроме того,
ls -lR
может использоваться какfind .
источник
Вы могли бы использовать
ls -1 *.mp4 | wc -l
.Это выведет список всех файлов, заканчивающихся на
.mp4
, напечатав каждый файл в новой строке (ls -1 *.mp4
),wc
передаст вывод, в который будет подсчитывать количество новых строк, используя-l
флаг.источник
*.mp4
она расширяется оболочкой,ls
этого не произойдет, если.mp4
в каталоге так много файлов, что их список не может быть передан вls
качестве аргументов.--.mp4
--
решит второй случай; первый вызовет сообщение об ошибке (вам нужно много файлов!) и еще один приятный вопрос здесь. Угловые чехлы, но стоит заметить, да.-q
или-b
, это не допускает переводы строк в именах файлов. Если вы запускаетеls -1 *.mp4
из своего терминала без канала, видите ,ls
что его стандартный вывод является терминалом и принимает,-q
как подразумевается, печать?
s. Но это поведение исчезает, когда вывод передается по конвейеру.ls -1 *.mp4 | wc -l
Пересчет, если есть новые строки.ls -1 *.mp4 | cat
показывает, чтоwc
"видит". (Точно так же-1
подразумевается, когда stdout не является терминалом, поэтому это необязательно.)ls -1q -- *.mp4 | wc -l
Почти работает, но не с нулевыми файлами .mp4.Это должно дать вам список файлов с .mp4
В сочетании с
wc -l
даст вам рассчитыватьесли вы хотите, чтобы поиск включал подкаталоги
источник
wc -l
ls /directory/*.mp4
заставляет оболочку расширять глобус и выполнять что-то вроде этого.ls /directory/file1.mp4 /directory/file2.mp4 ...
Это не удастся, если каталог содержит больше файлов mp4, чем может быть передано в качестве аргументовls
.В bash один холодный способ использования массивов с glob:
источник
Замените (.csv на нужное вам расширение)
Пояснение: я думаю, что простая схема - это получить список файлов и посчитать расширение с помощью grep.
\.
сопоставлять.
и$
сопоставлять расширение в конце строки. Это работает потому, что когда вывод ls передается по конвейеру, в каждой строке отправляется одно имя файла, что можно проверить, выполнив:источник
grep --count
, вы также можете использоватьgrep -c
.Проверьте, как считать файлы по расширению в Linux? , это дает хороший ответ и объяснение, вы можете использовать следующую команду:
источник