Как я рекурсивно удаляю подкаталоги и файлы, но не первый родительский каталог?

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

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

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

11
задан 11.02.2010, 16:34

4 ответа

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

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

Обратите внимание, что * за пределами двойных кавычек. Эта форма также работала бы:

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

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

11
ответ дан 07.12.2019, 12:15

Еще три опции.

  1. Использовать find с -mindepth 1 и -delete:

    Уровни −mindepth
    Не применяйте тесты или действия на уровнях меньше, чем уровни (non‐negative целое число).
    Средства −mindepth 1 обрабатывают все файлы кроме параметров командной строки.

    - удалить
    Удалите файлы; верный, если удаление, за которым следуют. Если удаление перестало работать, сообщение об ошибке выпущено. Если −delete перестанет работать, то статус выхода находки будет ненулевым (когда он в конечном счете выйдет). Использование −delete автоматически включает −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. Идите вперед и удалите родительский каталог, но воссоздайте его. Вы могли создать функцию удара, чтобы сделать это с одной командой; вот простая острота:

    rm -rf '/target/dir with spaces' ; mkdir '/target/dir with spaces'
7
ответ дан 07.12.2019, 12:15

Как насчет

rm -rf /target/directory\ path/*

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

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

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

2
ответ дан 07.12.2019, 12:15
find /target/directory/ -xdev -depth -mindepth 1 -exec rm -Rf {} \;
2
ответ дан 07.12.2019, 12:15

Теги

Похожие вопросы