Відповіді:
Використовуючи чудову відповідь від @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, і вирішує вашу проблему.
Це повинно зробити трюк, запустити його в оболонці.
find /Volumes/WD/ -type d -name '*TEST*' | while read a; do if [ ! -f $a/Data.log ]; then echo $a; fi; done;