Я хочу "очистить" все файлы в каталоге, включая все файлы в подкаталогах, но я хочу оставить подкаталоги на месте. Насколько я понимаю rm -r
, это также приведет к удалению самих подкаталогов.
Я не хочу удалять скрытые (точечные) файлы.
Как это может быть сделано?
command-line
find
rm
Скотт Уилтон
источник
источник
find -type f ! -name "[.]*" -delete
не подходит?-delete
- это просто напечатать имена файлов для удаления.Ответы:
Используйте
find
для этого:источник
-delete
I do not want to delete hidden (dot) files.
+
(по крайней мере, не в семьях Bourne, csh или rc). Существует легенда, которая гласит, что некоторые старые версииcsh
требуют побега,{}
но я никогда не сталкивался с ними.find . ! -name '.*' ! -type d ! -path '*/.*'
должны сделать эту работу.find . -name '.?*' -prune -o ! -type d -exec rm {} +
бы вообще не спускаться в них. Обратите внимание, что--
здесь нет необходимости (хотя это и не вредит), поскольку пути начинаются с./
.попробуйте что-то вроде:
источник
.... -exec rm {} +
?-exec rm {} +
не параллельный, он просто вызываетrm
несколько имен файлов. Он запускает меньшеrm
вызовов, поэтому более дружественен к ресурсам. Если это немного менее безопасно в этом, это увеличивает окно гонки, в пределах которого компонент каталога файлов, чтобы удалить, может быть изменен на символическую ссылку. Но только-delete
или-execdir rm {} \;
полностью решит эту проблему.-exec
стандарт.-delete
и,-execdir
хотя они пришли из BSD, GNU добавил их около 10 лет спустя. В любом случае, это не имеет ничего общего с Linux, который является просто ядром.