Как мне найти все папки в каталоге, которые содержат менее x файлов .flac
?
2 ответа
Для каждого подкаталога, напечатать имя подкаталога , если есть в большинстве 42
.flac
файлов в подкаталоге. Чтобы выполнить команду для каталогов, замените-print
на-exec … \;
, POSIX-совместимый.find . -type d -exec sh -c 'set -- "$0"/*.flac; [ $# -le 42 ]' {} \; -print
Обратите внимание, что эта команда не будет работать для поиска каталогов, содержащих ноль файлов
.flac
("$0/*.flac"
расширяется хотя бы до одного слова). Вместо этого используйтеfind . -type d -exec sh -c 'set -- "$0"/*.flac; ! [ -e "$1" ]' {} \; -print
Тот же алгоритм в Zsh.
**/*
рекурсивно расширяет все файлы в текущем каталоге и его подкаталогах.**/*(/)
ограничивает расширение до каталогов.{.,**/*}(/)
добавляет текущий каталог. Наконец,(e:…:)
ограничивает расширение совпадениями, для которых шелл-код возвращает 0.echo {.,**/*}(/e:'set -- $REPLY/*.flac(N); ((# <= 42))':)
Это может быть разбито в два этапа для удобочитаемости.
few_flacs () { set -- $REPLY/*.flac(N); ((# <= 42)); } echo {.,**/*}(/+few_flacs)
Журнал изменений:
• правильно обрабатывать x = 0.
Замените $MAX
своим собственным пределом:
find -name '*.flac' -printf '%h\n' | sort | uniq -c | while read -r n d ; do [ $n -lt $MAX ] && printf '%s\n' "$d" ; done
Примечание. При этом будут напечатаны все подкаталоги с количеством файлов .flac
от 0
до $MAX
(оба исключены).