Используя отличный ответ от @Nifle, но, учитывая ваши особенности, попробуйте:
% find /Volumes/WD -type d -name *[TEST]* | while read a; do if [ ! -f $a/Data.log ]; then echo $a; fi; done
Разбивая эту строку:
find /Volumes/WD -type d -name *[TEST]*: Просматривает дерево файлов из /Volumes/WD во внешнем HD, ища каталоги (-type d), которые имеют [TEST] где-то в своем имени (-name *[TEST]*).
Вывод команды find по трубопроводу (по | в bash while петля , которая тянет соответствующие каталоги из одного в то время , сохраняя их в переменной a
Внутри цикла:
- Оператор
if проверяет, что файл Data.log не находится в рассматриваемом каталоге. В операторе if $a раскрывается так, что $a/Data.log - это путь, подобный /Volumes/WD/<dir1>/<dir2>/Data.log . Чтобы получить интересующий вас тест ! и -f используются для того, чтобы только в случаях, когда файл с таким именем не существует, будет иметь значение TRUE (! NOT , а -f указывает на файл, а не на любой другой тип записи файловой системы, такой как каталоги или ссылки).
- Наконец, если мы находим соответствующий каталог, он печатается с помощью
echo $a где $a заменяется, как указано выше, именем каталога, переданным из find .
Я знаю, что перефразирую предыдущий ответ, но я надеюсь, что это прояснит то, что происходит в замечательной однострочной версии, предложенной @Nifle, и решит вашу проблему.