7

Как мне найти все папки в каталоге, которые содержат менее x файлов .flac ?

2 ответа2

9
  • Для каждого подкаталога, напечатать имя подкаталога , если есть в большинстве 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.

2

Замените $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 (оба исключены).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .