Здесь я хочу удалить все файлы тильды из моих каталогов и подкаталогов. Как я могу использовать здесь команду linux?
Древовидная структура:
.
|-- Block_Physical_design_checklist
| |-- Block_Physical_design_checklist.config
| |-- Block_Physical_design_checklist.html
| |-- Block_Physical_design_checklist.html~
| `-- rev6
| |-- rev6.config
| `-- rev6.html
|-- CAD_checklist
| |-- CAD_checklist.config
| |-- CAD_checklist.html
| |-- CAD_checklist.html~
| `-- rev6
| |-- rev6.config
| `-- rev6.html
|-- Formality_DCT_Vs_ICC
| |-- Formality_DCT_Vs_ICC.config
| |-- Formality_DCT_Vs_ICC.html
| |-- Formality_DCT_Vs_ICC.html~
| `-- rev6
| |-- rev6.config
| |-- rev6.html
| `-- rev6.html~
Ожидаемая древовидная структура:
.
|-- Block_Physical_design_checklist
| |-- Block_Physical_design_checklist.config
| |-- Block_Physical_design_checklist.html
| `-- rev6
| |-- rev6.config
| `-- rev6.html
|-- CAD_checklist
| |-- CAD_checklist.config
| |-- CAD_checklist.html
| `-- rev6
| |-- rev6.config
| `-- rev6.html
|-- Formality_DCT_Vs_ICC
| |-- Formality_DCT_Vs_ICC.config
| |-- Formality_DCT_Vs_ICC.html
| `-- rev6
| |-- rev6.config
| |-- rev6.html
В вашем подходе find. -type f -name '*~' -exec rm -f '{}' \;
есть несколько проблем/областей улучшения:
-name '*~'
соответствует только файлам, оканчивающимся на ~
; если вы хотите сопоставить любой файл, содержащий ~
, используйте*~*
-exec rm -f '{}' \;
порождает rm
для каждого файла, что неуклюже и неэффективно; вместо этого, поскольку rm
может принимать несколько файлов в качестве аргументов, вы можете указать find... -exec
получить столько файлов за один раз, не вызывая ARG_MAX
, используя аргумент +
для-exec
Соединение этих двух вместе:
find. -type f -name '*~*' -exec rm -f {} +
Если у вас есть GNU find
, вы можете использовать действие -delete
:
find. -type f -name '*~*' -delete
В zsh
вы можете выполнять рекурсивное сопоставление и удаление шаблонов за один раз, например:
rm -f -- **/*~*(.)
модификатор glob .
соответствует только обычным файлам.
С опцией globstar
bash:
shopt -s globstar ; rm./**/*~
globstar
допускает рекурсивное подстановывание с помощью **
, в то время как ./
предотвращает проблемы с именами файлов, которые могут иметь начальный -
в них, а *~
будет соответствовать именам файлов, заканчивающимся на тильду