10

Я могу использовать следующее, чтобы удалить целевой каталог и рекурсивно все его подкаталоги и содержимое.

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

Однако я не хочу, чтобы целевой каталог был удален. Как я могу удалить только файлы в целевой папке, подкаталогах и их содержимом?

4 ответа4

11

Предыдущий ответ почти правильный. Однако вы не должны заключать в кавычки символы оболочки, если хотите, чтобы они работали. Итак, это команда, которую вы ищете:

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

Обратите внимание, что * находится вне двойных кавычек. Эта форма также будет работать:

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

Если у вас есть * в кавычках, как показано выше, то он будет пытаться удалить только один файл с буквальным именем * внутри целевого каталога.

7

Еще три варианта.

  1. Используйте find с -mindepth 1 и -delete:

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

    -удалять
    Удалить файлы; истина, если удаление прошло успешно. Если удаление не удалось, выдается сообщение об ошибке. Если -delete терпит неудачу, состояние выхода find будет отличным от нуля (когда оно в конечном итоге завершится). Использование -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
find /target/directory/ -xdev -depth -mindepth 1 -exec rm -Rf {} \;
2

Как насчет

rm -rf /target/directory\ path/*

Если могут быть файлы, начинающиеся с. в целевом каталоге.

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

Эта секунда будет соответствовать всему, начинающемуся с., Кроме. а также .. Это потерпит неудачу на именах как .a, но это не очень распространено. При необходимости его можно настроить, чтобы охватить все случаи.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .