ВТОРАЯ ПОПЫТКА
Хорошо, после того, как я сам попробую это сделать в моей собственной папке Music, это решение обеих ваших запросов:
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" {} \;
Итак, в вашем сценарии было несколько ошибок:
- Вы использовали
mindepth
вместо maxdepth
.
- Точки (.) В вашем egrep соответствовали бы любому символу. Так что
.wma
соответствовал бы Snowman.txt.
- Вам не нужно было делать второй тест для типа «d», поскольку в команду оболочки передаются только каталоги.
Примечания к моему сценарию:
- Использование:
findodd.sh <top_folder> <no_of_files>
- Цитаты имеют решающее значение. Определение
COMMAND
на самом деле представляет собой 2 строковых литерала по обе стороны от $2
. Это действительно важно.
- В нем перечислены только папки, содержащие файлы, а не сами файлы. Чтобы сделать последнее, вам нужно заменить
echo "$0"
на другую find
.
Сейчас я тестировал на компьютере с Arch Linux, и моя оболочка была 'bash', поэтому я не знаю, сработает ли она на OSX, так как все оболочки НЕ созданы равными. :-)
ПЕРВАЯ ПЕРВАЯ ПОПЫТКА:
Хммм. Я не знаю, насколько OSX похож на Unix/Linux, но я сделаю это.
Я полагаю, что ответ на оба ваших вопроса заключается в первом тесте команды sh -c. Это бит, который гласит:
$(find "$0" -mindepth 1 | wc -l) -eq 1
Чтобы передать второй параметр в ваш скрипт для количества файлов, вы должны просто изменить «1» на $ 2, так что тест будет:
$(find "$0" -mindepth 1 | wc -l) -eq $2
Не ставьте кавычки вокруг $2
потому что в противном случае он будет интерпретироваться как второй параметр, передаваемый команде sh -c, а не вашему сценарию.
Командная строка будет тогда:
./findodd.sh /Users/paul/Music 2
Чтобы выполнить ваше второе требование, насколько я понимаю, вам нужно поместить команду egrep
в этот первый тест, таким образом:
$(find "$0" -mindepth 1 |egrep ".mp4|.mp3|.ogg|.flac|.wma|.m4a"| wc -l) -eq $2
Возможно, вам придется смотреть цитаты, хотя.
В любом случае, попробуй и дай нам знать.