Главная проблема заключается в том, что find дает вам прекрасный список каталогов в качестве вывода, но вам нужен способ оценить каждый из них самостоятельно, чтобы определить, есть ли у них *ACD*
где-то в подкаталоге. И, по-видимому, конвейерные команды не работают хорошо (или вообще?) в качестве аргумента для поиска -exec
.
Таким образом, один из подходов заключается в создании собственного командного сценария, который может вызывать -exec
, который будет возвращать 0, если его аргумент не содержит подкаталога *ACD*
, и 1 в противном случае. Кажется, это работает для меня:
#!/bin/sh
# script: /path/to/hasnoACD
list=`find $1 -name '*ACD*'`
[ "x$list" = "x" ] && exit 0 || exit 1
Тогда желаемая команда поиска просто использует -exec
дважды:
find /a/b -type d -mindepth 2 -depth ! -name '*ACD*' -mtime +180 -exec /path/to/hasnoACD {} \; -exec rm -rf {} +
-exec /path/to/hasnoACD {} \;
оценит как истинное только для тех случаев, которые вы хотите.
Другая альтернатива: я изначально подошел к этому способом, похожим на @ icyrock-com, в результате я нашел команду find, переданную в цикл while, который обрабатывает удаление каталогов. Синтаксис while будет зависеть от вашей оболочки, и вам понадобится способ различать каталоги, которые содержат некоторый подкаталог *ACD*
как мы делали выше со hasnoACD
, но в bash на FreeBSD, похоже, работает следующее:
find /a/b -type d -mindepth 2 -depth ! -name '*ACD*' -mtime +180 | while read mydir ; do find $mydir -name '*ACD*' | xargs false && rm -rf $mydir ; done
Обратите внимание на поиск внутри цикла while - только когда этот поиск ничего не возвращает (без подкаталогов *ACD*
), xargs возвращает true, так что выполняется rm -rf $mydir
. Такое поведение xargs работает на моей машине с FreeBSD, но в Linux или Solaris поведение отличается, поэтому потребуется другой тест.
Как говорит @ icyrock-com, вы можете захотеть сделать mv
а не rm
, просто чтобы быть в безопасности.