Итак, вы хотите просмотреть каталоги вида */analysis
, исключая определенные подкаталоги.
Вместо поиска всего под .
ищите только под */analysis
.
Чтобы исключить подкаталог, используйте -prune
. Это действие указывает find не проходить рекурсивно по этому подкаталогу.
Наконец, чтобы проверить, существует ли файл, соответствующий шаблону, вам нужно вызвать оболочку. Вы вызываете test
непосредственно из find
, но test
не выполняет сопоставление с образцом, поэтому проверяется только наличие файла, имя которого содержит буквальный символ *
. Вызовите sh
, передав ему имя каталога в качестве аргумента :-exec sh -c '…' {} \;
. В коде sh разверните подстановочный знак, чтобы создать список соответствующих файлов, и проверьте, существует ли хотя бы один существующий файл.
find./*/analysis -name "doc" -prune -o -name "gold" -prune -o \
-type d \! -exec sh -c 'set -- "$0"/*_out.csv; test -e "$1"' {} ';' -print
(Я предполагаю, что не существует оборванных символических ссылок, имя которых заканчивается на _out.csv
.)