Это все одна строка, но я разбил ее здесь для удобства чтения
find /home
\( -wholename '/home/exception1'
-o -wholename '/home/exception2'
-o -wholename '/home/exception3' \)
-prune -o
-wholename '*/public_html/outdated' -type d
-exec rm -rvf \{} \;
Перед запуском настоятельно рекомендуем заменить бит -exec rm -rvf \{} \;
на -print
, чтобы убедиться, что он печатает только то, что вы хотите удалить.
Вот как это работает: find
рекурсивно находит вещи. материал в \(
... \)' matches directories you want to skip entirely (ie: prune). The standard pattern for using
-prune is to say what you want to prune out, then
-prune -o`, а затем материал, который вы действительно хотите сопоставить.
Мы хотим сопоставить каталоги public_html/outdated
, так что для этого -wholename '*/public_html/outdated' -type d
. (-type d
означает «каталог»).
Наконец приходит действие, которое мы хотим выполнить. Еще раз замените эту часть на -print
, пока не убедитесь, что она делает то, что вы хотите.
Одно предостережение: это выдаст кучу предупреждений вида:
find: `/home/foo/public_html/outdated': No such file or directory
Это потому, что find пытается войти в те каталоги, которые он только что удалил. Вы можете спокойно их игнорировать - поиск будет продолжен, несмотря на предупреждения.