Відповіді:
Для кожного підкаталогу надрукуйте ім'я підкаталогу, якщо у підкаталозі є щонайбільше 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
в підкаталозі немає файлів.