Я могу использовать следующее для удаления целевого каталога и рекурсивно всех его подкаталогов и содержания.
find '/target/directory/' -type d -name '*' -print0 | xargs -0 rm -rf
Однако я не хочу, чтобы целевой каталог был удален. Как я могу удалить просто файлы в цели, подкаталогах и их содержании?
Предыдущий ответ почти корректен. Однако Вы не должны заключать символы шарика оболочки в кавычки, если Вы хотите, чтобы они работали. Так, это - команда, которую Вы ищете:
rm -rf "/target/directory with spaces/"*
Обратите внимание, что * за пределами двойных кавычек. Эта форма также работала бы:
rm -rf /target/directory\ with\ spaces/*
Если Вы имеете *
в кавычках как показано выше, затем это только попытается удалить единственный файл, буквально названный *
в целевом каталоге.
Еще три опции.
Использовать 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'
Как насчет
rm -rf /target/directory\ path/*
Если могут быть файлы, запускающиеся с. в целевом каталоге.
rm -rf "/target/directory path/*" "/target/directory path/.??*"
Эта секунда будет соответствовать всему запускающемуся с a., кроме. и.. Это перестанет работать на именах как.a, но это не очень распространено. Это можно было настроить при необходимости для покрытия всех случаев.