Используя отличный ответ от @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, и решит вашу проблему.