Як мені рекурсивно видаляти підкаталоги та файли, але не перший батьківський каталог?


14

Я можу використовувати наступне для видалення цільового каталогу та рекурсивно всіх його підкаталогів та вмісту.

find '/target/directory/' -type d -name '*' -print0 | xargs -0 rm -rf

Однак я не хочу видаляти цільовий каталог. Як я можу видалити лише файли з цілі, підкаталогів та їх вмісту?

Відповіді:


12

Попередня відповідь майже правильна. Однак ви не повинні цитувати символів глобальної оболонки, якщо ви хочете, щоб вони працювали. Отже, це команда, яку ви шукаєте:

rm -rf "/target/directory with spaces/"*

Зауважте, що * знаходиться поза подвійними лапками. Ця форма також працює:

rm -rf /target/directory\ with\ spaces/*

Якщо у вас є *лапки, як показано вище, то вона буде намагатися видалити єдиний файл, буквально названий *всередині цільового каталогу.


1
Це не працює із прихованими файлами та папками. Мені довелося це зробити ще раз із
The Unfun Cat

8

Ще три варіанти.

  1. Використовувати за findдопомогою -mindepth 1та -delete:

    −mindepth рівні
    Не застосовувати жодних тестів чи дій на рівнях менших від рівнів (невід'ємне ціле число).
    −mindepth 1 означає обробляти всі файли, крім аргументів командного рядка.

    -delete
    Видалити файли; вірно, якщо видалення вдалося. Якщо видалення не вдалося, видається повідомлення про помилку. Якщо −delete не вдається, статус виходу знаходження буде ненульовим (коли він врешті-решт закінчується). Використання −delete автоматично вмикає параметр −depth.
    Перед використанням цієї опції ретельно перевіряйте параметр -depth.

    # optimal?
    # -xdev      don't follow links to other filesystems
    find '/target/dir with spaces/' -xdev -mindepth 1 -delete
    
    # Sergey's version
    # -xdev      don't follow links to other filesystems
    # -depth    process depth-first not breadth-first
    find '/target/dir with spaces/' -xdev -depth -mindepth1 -exec rm -rf {} \;
    



2. Використовуйте findфайли, а не каталоги. Це дозволяє уникнути необхідності rm -rf:

    # delete all the files;
    find '/target/dir with spaces/' -type f -exec rm {} \;

    # then get all the dirs but parent
    find '/target/dir with spaces/' -mindepth 1 -depth -type d -exec rmdir {} \;

    # near-equivalent, slightly easier for new users to remember
    find '/target/dir with spaces/' -type f -print0 | xargs -0 rm
    find '/target/dir with spaces/' -mindepth 1 -depth -type d -print0 | xargs -0 rmdir



3. Вперед і видаліть батьківський каталог, але відтворіть його. Ви можете створити функцію bash, щоб зробити це за допомогою однієї команди; ось простий однострочний:

    rm -rf '/target/dir with spaces' ; mkdir '/target/dir with spaces'

2

Як щодо

rm -rf /target/directory\ path/*

Якщо можуть бути файли, починаючи з. в цільовому каталозі.

rm -rf "/target/directory path/*" "/target/directory path/.??*"

Ця секунда відповідатиме всьому, що починається з., Крім. і .. Не вдасться в таких іменах, як .a, але це не дуже часто. Його можна налаштувати, якщо необхідно, щоб охопити всі випадки.


Я спробував обидва, і вони не працюють на мене. Можливо, це тому, що мій шлях до цільового каталогу має в ньому пробіли? rm -rf '/ target / directory path / *' Він не дає помилок, але підкаталоги залишаються.
Майкл Прескотт

Вам потрібно уникнути пробілів, або з косою косою рисою (\) перед пробілом, або додавши в лапки все ім’я каталогів ("). Я редагував приклади, щоб це показати.
KeithB

Дякую, я спробував це, як показано в попередньому коментарі, і досі не пішов. (Я використовую OS X, це не має значення?)
Майкл Прескотт,

OS X повинна працювати добре, саме цим я і користуюся. Переконайтесь, що ви не використовуєте зворотну косу рису та лапки. Лише те чи інше.
KeithB

Так, просто використовуючи цитати. Якщо я видаляю * і тому я використовую лише rm -rf "/ target / каталог path /", каталог "шлях до каталогу" буде видалено разом з підкаталогами "path path". Якщо я використовую rm -rf "/ target / path path / *", нічого не відбувається.
Майкл Прескотт

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