Відповіді:
Для кожного підкаталогу надрукуйте ім'я підкаталогу, якщо у підкаталозі є щонайбільше 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.
flacфайлів (x = 0). Я говорив, що якщо каталог не містить flacфайлів, $#це 1, тому що $1це буквально path-to-dir/*.flac(оскільки немає розширення), каталог все одно надрукується. Це просто інша точка зору, я припускаю, що каталог без flacфайлів не відповідає запиту.
Замініть $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(обидва виключені).
read -r n dімена каталогів випадків містили зворотні риски, а printf "%s "$d"в іменах каталогів випадків - пробіли або -\['"\\`.
-r, що я дуже пропустив це! Але я не можу бачити жодної проблеми з ехою, вона правильно працює з такими каталогами, як: st r \ a \ `n- [g \" e
-*?\\[. Спробуйте створити два каталоги під назвою fooі f*, зі f*збігом. Або каталог, який називається foo bar(два пробіли). Або (залежно від вашої оболонки) каталог, який називається -eабо -n.
-e... зло!
-name '*.flac'.
$#завжди принаймні 1, отже[ $# -le 42 ]вірно, колиflacв підкаталозі немає файлів.