Bash: Найдите папки с меньше, чем x файлами

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

7
задан 14.10.2014, 21:47

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 правильно.

9
ответ дан 07.12.2019, 14:46

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

2
ответ дан 07.12.2019, 14:46

Теги

Похожие вопросы