Как мне найти все папки в каталоге, которые содержат менее 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 (оба исключены).
