Як змусити «знайти» виключити папку, в якій він шукає?


18

Я виконую наступну команду:

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

Я хотів би видалити всі папки в processingпапці (папка для обробки ніколи не повинна видалятися).

Команда також видаляє processingпапку. Як обмежити скрипт, щоб видалити лише папки в цій папці?


Відповіді:


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опцію.


Привіт, я отримую "find: попередження: ви вказали параметр -mindepth після аргументу не-параметр-type, але параметри не є позиційними (-mindepth впливає на тести, визначені перед ним, а також на ті, що вказані після нього). Будь ласка, вкажіть параметри перед іншими аргументами. ", а також" знайти: не можна видалити `/ folder / 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 {} \;

Остання команда неправильна. -nameпосилається на базове ім'я, воно ніколи нічого не співпадає з косою рисою. Можливо, вам потрібно скористатися -path.
Каміль Маціоровський

1

Вже відповів, все ж я хотів би перерахувати інший підхід.

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

Це виключає головний каталог (а також підкаталоги), і тепер ви можете застосувати будь-яку команду, яку ми хочемо застосувати над ним.

>> Опції:
-mindepth 1: Виключити кореневий каталог
-maxdepth 1: Щоб уникнути розбору підкаталогів. (Для конкретного сценарію, про який ви питаєте, вам це не потрібно).
-тип d: Список лише типів каталогів. Цей параметр повинен з’явитися після використання mindepth maxdepth.


Чому -maxdepth 1? Чому -type dдвічі? Чим це відрізняється від прийнятої відповіді?
Attie

@Attie: Спасибі, виправили помилку. maxdepth не є необхідним, але було б корисно, якщо ви хочете уникати переліку підкаталогів.
прашант
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.