Відповіді:
Використовуючи чудову відповідь від @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;