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


10

Я хочу "очистить" все файлы в каталоге, включая все файлы в подкаталогах, но я хочу оставить подкаталоги на месте. Насколько я понимаю rm -r, это также приведет к удалению самих подкаталогов.

Я не хочу удалять скрытые (точечные) файлы.

Как это может быть сделано?


1
find -type f ! -name "[.]*" -deleteне подходит?
Костас

Я не знаю. Это делает то, что я спрашиваю?
Скотт Уилтон

Попробуйте без -delete- это просто напечатать имена файлов для удаления.
Костас

Вы хотите удалить файлы (скрытые или нет) в скрытых каталогах?
Стефан Шазелас

Как насчет символических ссылок на каталоги?
Стефан Шазелас

Ответы:


10

Используйте findдля этого:

find . ! -name '.*' ! -type d -exec rm -- {} +

1
Не все находят реализации есть-delete
wurtel

3
@RomeoNinov, пожалуйста, прочитайте ОП вопрос:I do not want to delete hidden (dot) files.
Джимми

1
@Costas, нет, нет оболочки, которая требует экранирования +(по крайней мере, не в семьях Bourne, csh или rc). Существует легенда, которая гласит, что некоторые старые версии cshтребуют побега, {}но я никогда не сталкивался с ними.
Стефан Шазелас

1
@ScottWilton Скрытые каталоги включены, но скрытых файлов в скрытых каталогах нет. Если вы хотите отклонить все файлы в скрытых каталогах, то find . ! -name '.*' ! -type d ! -path '*/.*'должны сделать эту работу.
Джимми

1
@jimmy, больше хотелось find . -name '.?*' -prune -o ! -type d -exec rm {} +бы вообще не спускаться в них. Обратите внимание, что --здесь нет необходимости (хотя это и не вредит), поскольку пути начинаются с ./.
Стефан Шазелас

0

попробуйте что-то вроде:

find <path> ! -name '.*' -type f -exec rm {} \;

Любая причина, почему нужно удалять файлы по одному вместо ускорения .... -exec rm {} + ?
Антон

Я предпочитаю делать вещи по одному. Массовые (и параллельные) операции имеют некоторое время странные (и неприятные) побочные эффекты (так как создают огромную нагрузку на подсистему ввода-вывода)
Ромео Нинов

1
-exec rm {} +не параллельный, он просто вызывает rmнесколько имен файлов. Он запускает меньше rmвызовов, поэтому более дружественен к ресурсам. Если это немного менее безопасно в этом, это увеличивает окно гонки, в пределах которого компонент каталога файлов, чтобы удалить, может быть изменен на символическую ссылку. Но только -deleteили -execdir rm {} \;полностью решит эту проблему.
Стефан Шазелас

@ StéphaneChazelas, ни один из них (-delete или -execdir) не существует в UNIX. И я не вижу в вопросе упоминания Linux!
Ромео Нинов

@RomeoNinov, да, я сказал в другом комментарии, что это только -execстандарт. -deleteи, -execdirхотя они пришли из BSD, GNU добавил их около 10 лет спустя. В любом случае, это не имеет ничего общего с Linux, который является просто ядром.
Стефан Шазелас
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.