Есть ли способ проверить папки на вашем Mac на предмет отсутствия элементов?

Скажем, я хочу отсканировать свой внешний жесткий диск и найти все папки с определенным словом в заголовке, в которых отсутствует файл Data.log?

Что было бы самым простым способом сделать это, или это вообще возможно?

2 ответа2

3

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

1

Это должно сделать трюк, запустить его в оболочке.

find /Volumes/WD/ -type d -name '*TEST*' | while read a; do if [ ! -f $a/Data.log ]; then echo $a; fi; done;

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .