DRUGIE PODEJŚCIE
OK, po samodzielnym wypróbowaniu tego w moim własnym folderze Muzyka jest to rozwiązanie dla obu twoich żądań:
COMMAND='[[ $(find "$0" -maxdepth 2 |egrep "\.mp4|\.mp3|\.ogg|\.flac|\.wma|\.m4a"| wc -l) == '$2' ]] && echo "$0"'
find $1 -type d -exec sh -c "$COMMAND" {} \;
W twoim skrypcie było kilka błędów:
- Używałeś
mindepthzamiast maxdepth.
- Okresy (.) W twoim egrep pasowałyby do dowolnego znaku. Tak
.wmaby pasowało do „Snowman.txt”.
- Nie trzeba było wykonywać drugiego testu dla typu „d”, ponieważ do polecenia powłoki przekazywane są tylko katalogi.
Uwagi na temat mojego skryptu:
- Wykorzystanie:
findodd.sh <top_folder> <no_of_files>
- Cytaty są krytyczne. Definicja
COMMANDjest w rzeczywistości 2 literałami ciągów po obu stronach $2. To naprawdę ważne.
- Wyświetla tylko foldery zawierające pliki, a nie same pliki. Aby to zrobić, musisz zastąpić
echo "$0"drugi find.
Teraz testowałem na maszynie Arch Linux, a moja powłoka jest „bash”, więc nie mam pojęcia, czy to działa na OSX, ponieważ wszystkie powłoki NIE są sobie równe. :-)
WCZEŚNIEJSZA PIERWSZA PRÓBA:
Hmmmm. Nie wiem, jak podobny jest OSX do Uniksa / Linuksa, ale dam to w parze.
Odpowiedź na oba pytania, jak sądzę, leży w pierwszym teście polecenia „sh -c”. Oto fragment, który brzmi:
$(find "$0" -mindepth 1 | wc -l) -eq 1
Aby przekazać drugi parametr do skryptu dla liczby plików, powinieneś być w stanie po prostu zmienić „1” na 2 $, więc test będzie:
$(find "$0" -mindepth 1 | wc -l) -eq $2
Nie umieszczaj cudzysłowów wokół, $2ponieważ w przeciwnym razie zostanie zinterpretowany jako drugi parametr przekazany do polecenia „sh -c”, a nie do skryptu.
Linia poleceń byłaby wtedy:
./findodd.sh /Users/paul/Music 2
Aby osiągnąć swoje drugie wymaganie, jak rozumiem, musisz umieścić egreppolecenie w pierwszym teście, a więc:
$(find "$0" -mindepth 1 |egrep ".mp4|.mp3|.ogg|.flac|.wma|.m4a"| wc -l) -eq $2
Być może będziesz musiał oglądać cytaty.
W każdym razie daj sobie spokój i daj nam znać.