Рекурсивное удаление содержимого каталога, но не самого каталога [дубликат]

У меня есть каталог, который содержит другие каталоги и файлы неизвестной глубины. Как я могу удалить только содержимое каталога - вложенные каталоги и файлы - но не сам каталог?

Я пробовал эти варианты, но они не сработали - ничего не удалилось:

rm -rf my_dir/*/*
rm -rf my_dir/**
rm -rf my_dir/*

# and
cd my_dir
rm -rf */*

Как это сделать?

-3
задан 24 November 2017 в 11:57
1 ответ

Используйте find. Внимательно прочтите руководство, чтобы понять различные варианты, и проверьте его перед тем, как это сделать.

Вот простой пример использования mindepth. Примечание: если у вас очень глубокое дерево и много файлов, поиск может быть медленным и вызвать проблемы с файловой системой и высокую нагрузку (в зависимости от файловой системы и настроек). Остерегайтесь воздействия длительно выполняющихся команд поиска. Есть способы сделать поиск быстрее и эффективнее, так что читайте о них.

Пример: Вот структура, которую я создал

# tree my_dir/
my_dir/
|-- file
|-- my_dir2
|   `-- file2
`-- my_dir3
    `-- file3

. Затем мы вызываем find. Во-первых, я использую print вместо rm, чтобы убедиться, что я получаю именно то, что хочу. Здесь перечислены только каталоги, вы можете удалить тип, чтобы увидеть все, или добавить файл типа.

# find my_dir -mindepth 1 -type d -print
my_dir/my_dir3
my_dir/my_dir2

Затем примените рекурсивное удаление (здесь я использовал подробное описание для тестирования):

#find my_dir -mindepth 1 -type d -exec rm -rv {} \;
removed `my_dir/my_dir3/file3'
removed directory: `my_dir/my_dir3'
find: `my_dir/my_dir3': No such file or directory
removed `my_dir/my_dir2/file2'
removed directory: `my_dir/my_dir2'
find: `my_dir/my_dir2': No such file or directory

Здесь вы получите сообщение «Нет такого файла», поскольку find сначала сортирует список каталогов для выполнения рекурсивного поиска. При необходимости вы можете подавить это сообщение об ошибке.

Теперь проверьте дерево:

# tree ascii my_dir/
my_dir/
`-- file
0 directories, 1 file

Поскольку мы сказали тип -d и рекурсивное удаление, это не привело к удалению файла на первом уровне. Итак, мы запускаем:

# find my_dir -mindepth 1 -type f -exec rm -rv {} \;
removed `my_dir/file'

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

#tree my_dir
0 directories, 0 files

Это можно улучшить и сделать более элегантным, но я надеюсь, что это даст вам представление.

1
ответ дан 5 December 2019 в 21:58

Теги

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