В целях тестирования я хотел бы подсчитать, сколько файлов изображений находится в каталоге, отделяя каждый тип файла изображения по расширению (jpg = "yes". Это потому, что позже это будет полезно для другого сценария, который будет выполнять действие на каждое расширение файла). Могу ли я использовать что-то вроде следующего только для файлов JPEG?
jpg=""
count=`ls -1 *.jpg 2>/dev/null | wc -l`
if [ $count != 0 ]
then
echo jpg files found: $count ; jpg="yes"
fi
Учитывая расширения файлов jpg, png, bmp, raw и другие, я должен использовать while
цикл, чтобы сделать это?
источник
JPG
иjpg
файлы, и файлы, и я хотел их рекурсивно, поэтому мое решение было написатьfind . -type f | awk -F . '{print tolower($NF)}' | sort | uniq -c | awk '{print $2,":",$1}'
Это рекурсивно обходит файлы и подсчитывает соответствующие расширения:
источник
источник
find
. Кроме того, это может помочь будущим читателям этих ответов, если вы дадите краткое объяснение своего решения (на случай, если они захотят изменить его для немного другого случая).find
по умолчанию используется текущий каталог, как я это использую. Я не думаю, что Бог хотел, чтобы в именах файлов были пробелы, но в этом случае это прекрасно работает. Если у вас есть переводы строк, то вы заслуживаете всего, что получаете. Я подумал об объяснении, но решил, что ответ будет слишком длинным, думаю, важна простота. 99% случаев в 1% случаев. Это, вероятно, версия 7 совместима.Может быть, это может стать короче
источник
Все, что связано
ls
, может привести к неожиданным результатам со специальными символами (пробел и другие символы). Любой bashism (как массивы) не переносим. Все, что связаноwhile read
, обычно идет медленно.С другой стороны,
find
он ОЧЕНЬ гибок (множество опций для фильтрации), имеет [как минимум] два синтаксиса, которые отказоустойчивы для специальных символов ... и хорошо масштабируется в больших каталогах.В этом примере я использовал
-iname
совпадение с расширением в верхнем и нижнем регистре. Я также ограничил-maxdepth 1
соблюдение вашего вопроса "в текущем каталоге". Вместо подсчета количества строк, где имена файлов могут включать в себя CR / LF,-print0
будет печататься байт NULL в конце каждого имени файла ... так же| tr -d -c "\000" | wc -l
как и точный подсчет файлов (NULL байт!).PS
-print0 | tr -d -c "\000" | wc -c
можно заменить на-printf "\000" | wc -c
или даже-printf '\n' | wc -l
.источник
можно просто использовать ls для чего-то такого простого IMO
или
или
источник
Если вы уверены в расширении, вы можете пойти с
find
какисточник
touch $'foo\nbar.jpeg
и он будет засчитан дважды вместо одного. Или хуже, кто-то делаетmkdir directory.jpeg; touch directory.jpeg/{1..100}.txt