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

10

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

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

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

Скотт Уилтон
источник
1
find -type f ! -name "[.]*" -deleteне подходит?
Костас
Я не знаю. Это делает то, что я спрашиваю?
Скотт Уилтон
Попробуйте без -delete- это просто напечатать имена файлов для удаления.
Костас
Вы хотите удалить файлы (скрытые или нет) в скрытых каталогах?
Стефан Шазелас
Как насчет символических ссылок на каталоги?
Стефан Шазелас

Ответы:

10

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

find . ! -name '.*' ! -type d -exec rm -- {} +
jimmij
источник
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, который является просто ядром.
Стефан Шазелас