Как заставить «find» исключить папку, в которой он ищет?

18

Я запускаю следующую команду:

find /var/www/html/content/processing -type d -mtime +1 -exec rm -rf {} \;

Я хотел бы удалить все папки в processingпапке (папка обработки никогда не должна удаляться).

Команда также удаляет processingпапку. Как ограничить скрипт для удаления только папок в этой папке?

Элад Дотан
источник
1
Потомство: stackoverflow.com/questions/13525004/…
Тревор Бойд Смит

Ответы:

32

Самым простым способом было бы просто добавить -mindepth 1, что пропустит первую иерархию глубины и, таким образом, пропустит ваш родительский каталог.

Кроме того, вам не нужен дополнительный -execвызов rm, вы можете просто deleteнапрямую создавать папки, если они пусты.

find /var/www/html/content/processing -mindepth 1 -type d -mtime +1 -delete

Если они не пусты:

find /var/www/html/content/processing -mindepth 1 -type d -mtime +1 -exec rm -rf {} \;

Если вы ленивый, вы также можете расширить шаблон. Поскольку *по умолчанию не включает текущий каталог ( если он dotglobне установлен ), вы также можете сделать:

find /var/www/html/content/processing/* -type d -mtime +1 -delete

Однако это также не включает скрытые папки, опять же из-за dotglobопции.

slhck
источник
Привет, я получаю "find: warning: вы указали опцию -mindepth после аргумента не-option -type, но опции не позиционные (-mindepth влияет на тесты, указанные до него, а также те, которые указаны после него). Пожалуйста, укажите опции . перед другими аргументами " , а также«найти: не можете удалять `/ папки / 50d82faf0e09e ': каталог не пустой»
ELAD Dotan
Добавьте mindepth перед вводом затем. Чтобы удалить каталоги, когда они не пусты, вы можете придерживаться подхода rm, который вы использовали изначально.
slhck
4

Проблема в том, что find возвращает текущий каталог (.) Вместе с другими каталогами, поэтому удаляет папку обработки, а также подкаталоги. Быстрый способ обойти это было бы добавить опцию

-not -name .

который останавливает поиск при выводе текущего каталога и, в свою очередь, останавливает его удаление.

Это сработало бы, если бы вы выполняли команду в каталоге обработки, чтобы учесть тот факт, что вы используете абсолютный путь:

-not -name /var/www/html/content/processing

И вся команда будет:

find /var/www/html/content/processing -type d -mtime +1 -not -name /var/www/html/content/processing -exec rm -rf {} \;
Xenopathic
источник
Последняя команда неверна. -nameотносится к базовому имени, оно никогда не совпадает с косой чертой. Вам, вероятно, нужно использовать -path.
Камиль Мачоровский
1

Уже ответил, все же я хотел бы перечислить другой подход.

find /var/www/html/content/processing -mindepth 1 -maxdepth 1 -type d

Это исключит верхний каталог (а также подкаталоги), и теперь вы можете применить любую команду, которую мы хотим применить к нему.

>> Опции:
-mindepth 1: исключить корневой каталог.
-Maxdepth 1: избежать анализа подкаталогов. (Для конкретного сценария, который подвергается сомнению, вам это не нужно).
-type d: список только типов каталогов. Эта опция должна появиться после использования mindepth maxdepth.

Prashant
источник
Почему -maxdepth 1? Почему -type dдважды? Чем это отличается от принятого ответа?
Attie
@ Атти: Спасибо, исправил ошибку. В maxdepth нет необходимости, но было бы полезно, если вы хотите избежать подкаталогов.
Прашант