На этот вопрос уже есть ответ здесь:
У меня есть следующая конфигурация файлов и каталогов:
-Parent_dir
|-delme_dir
|-delme_file
|-aFile
|-sub_dir
|-delme_dir
|-delme_file
|-aFile
|-sub_dir
|-delme_dir
|-delme_file
|-aFile
|-sub_dir2
|-delme_dir
|-delme_file
|-aFile
Есть ли команда, которую я могу использовать из Parent_dir для рекурсивного удаления всех каталогов delme_dir и файлов delme_file ?
В единственной команде Вы могли сделать это:
find . \( -type d -name "delme_dir" -o -type f -name "delme_file" \) -delete
Если нет никакого другого соответствия каталогов или файлов с шаблоном delme_*
, можно сделать короче говоря.
find . -name "delme_*" -delete
Вы можете комбинировать find
, xargs
и rm
:
find . -type f -a -name delme_files -print0 | xargs -0 rm
и
find . -type d -a -name delme_dir -print0 | xargs -0 rmdir
(когда вы находитесь в каталоге Parent_dir
)
Возможно, есть способ объединить эти два find
в один, но я все равно нахожу это более ясным.
Команды find
найдут каталоги / файлы, названные в соответствии с вашим примером, и вы направите результаты в xargs
, который выполнит rm
(удалить) / rmdir
(удалить каталог) для каждого файла найдите «upstream», то есть из команды file
.
Если каталоги не пусты, замените rmdir
на rm -Rf
, но это рекурсивно удалит все файлы в каталогах, найденные командой find
.
Комбинация -print0
/ -0
будет гарантировать, что все файлы / каталоги будут обрабатываться правильно, даже те, которые имеют пробелы в своих именах (возможно, здесь не нужны, но лучше использовать в общих случаях).
Обязательно проверяйте вещи ранее на не важных данных и всегда имейте резервные копии.
shopt -s globstar
echo **/*delme* | xargs rm