Вопрос: Как я могу рекурсивно удалить все файлы определенного расширения в текущем каталоге?


Как безопасно удалить все файлы с определенным расширением (например, .bak) из текущего каталога и всех подпапок с использованием одной командной строки? Просто, я боюсь использовать rm так как я использовал его неправильно один раз, и теперь мне нужен совет.


414
2017-11-15 13:03


Источник




Ответы:


Вам даже не нужно использовать rm в этом случае, если вы боитесь. использование find:

find . -name "*.bak" -type f -delete

Но используйте его с осторожностью. Сначала запустите:

find . -name "*.bak" -type f

чтобы посмотреть, какие файлы вы удалите.

Также, убедись, что -delete является последним аргументом в вашей команде. Если вы положите его перед -name *.bak argument, он удалит все,

Видеть man find а также man rm для получения дополнительной информации и см. также этот связанный вопрос по SE:


644
2017-11-15 13:08



Как это отличается от rm *.bak? - sayantankhan
@ Bolt64 Ваш rm *.bak не будет работать для подкаталогов. - Radu Rădeanu
С настройками по умолчанию rm *.bak будет удалять только все файлы, заканчивающиеся на .bak в текущем каталоге. Для того, чтобы делать то же, что и в подкаталогах, которые вам нужно для скрипки с глобусами, используйте параметр -r или используйте пример поиска. - Hennes
@Hennes Будьте осторожны с rm -r *.bak! Он также удаляет каталоги, заканчивающиеся на .bak со всем их содержанием. - Radu Rădeanu
Убедиться что -delete является последним аргументом в вашей команде. Если вы положите его перед -name *.bak аргумент, он удалит все. - Michael


find . -name "*.bak" -type f -print0 | xargs -0 /bin/rm -f

32
2018-04-04 19:10



Добро пожаловать в askubuntu! Хотя это вполне верный ответ, я не думаю, что есть преимущество в использовании этого вместо -delete флаг find, Более подробную информацию можно найти в Руководство пользователя GNU для удаления файлов с помощью find, - Glutanimate
вы, вероятно, правы, это просто альтернативное решение, возможно, более сырое;) - lokers
Это не просто альтернатива, а пример того, как другие команды могут быть объединены вместе с трубой '|'. +1 - Boris Pavlović
Эти альтернативные решения работают в других средах, где отсутствует -delete (например, cygwin) - ciriarte
Я думаю, что это лучший ответ. - Léo Léopold Hertz 준영


Сначала запустите команду shopt -s globstar, Вы можете запустить это в командной строке, и это будет действовать только в этом окне оболочки. Вы можете поместить его в свой .bashrc, а затем все вновь запущенные снаряды заберут его. Эффект этой команды состоит в том, чтобы сделать **/ сопоставлять файлы в текущем каталоге и его подкаталогах рекурсивно (по умолчанию, **/ означает то же самое, что и */: только в непосредственных подкаталогах). Затем:

rm **/*.bak

(или gvfs-trash **/*.bak или что у вас есть).


28
2017-11-15 18:59





Удаление файлов для меня не является чем-то, что вы должны использовать rm для. Вот альтернатива:

sudo apt-get install gvfs     # install a tool that allows you to put stuff in the trash
alias "trash"="gvfs-trash"    # you can also put this in .bash_aliases or simply use the command without alias
trash *.bak                   # trash the files (thus moving them to the trash bin)

Как отмечает Флимм в комментариях:

Пакет trash-cli делает то же самое, что и gvfs-trash без зависимости от gvfs.

Так:

sudo apt-get install trash-cli

Вам не нужно делать псевдоним для этого, потому что trash-cli пакет предоставляет команду trash, который делает то, что мы хотим.

Как замечает Элиа Каган в обширных комментариях, вы также можете сделать это рекурсивным использованием find, В этом случае вы не можете использовать псевдоним, поэтому приведенные ниже команды предполагают, что вы установили trash-cli, Я суммирую комментарии Элиа:

Эта команда находит и отображает все .bak файлы и символические ссылки в любом месте в текущем каталоге или его подкаталогах или ниже.

find . -name '*.bak' -xtype f

Чтобы удалить их, добавьте -exec с trash команда:

find . -name '*.bak' -xtype f -exec trash {} +

-xtype f выбирает файлы и символические ссылки на файлы, но не папки. Чтобы удалить также папки .bak, удалите эту часть и используйте -execdir, что позволяет избежать cannot trash non-existent ошибки для .bak файлы внутри .bak справочники:

find . -name '*.bak' -execdir trash {} +

18
2017-11-15 13:52



«Не используйте rm чтобы удалить вещи »является спорным заявлением, но я должен согласиться с тем, что часто разумнее использовать что-то, что позволит вам отменить все. - Oli♦
Пакет trash-cli делает то же самое, что и gvfs-trash без зависимости от gvfs, - Flimm
Я отредактировал его в ответе, в следующий раз не стесняйтесь делать редактирование самостоятельно. - don.joey
@ don.joey Этот ответ, кажется, говорит find . -name "*.bak" -type f отображает, что trash *.bak удалений. Это действительно то, что вы имеете в виду? Вы можете перемещать каталоги в корзину с помощью trash или gvfs-trash, но trash *.bak будет перемещать только файлы и каталоги, имена которых заканчиваются .bak и которые находятся непосредственно в текущем каталоге. Оболочка расширяется *.bak, так trash *.bak не повлияет .bak файлы в подкаталогах, не названные самими .bak, - Eliah Kagan
@EliahKagan хорошее место. Да, в этом случае ls .*bak было бы лучше. Или у вас есть альтернатива, которая делает trash рекурсивная? - don.joey


Если вы хотите удалить все файлы определенного типа, но только одну папку «deep» из текущей папки:

find . -maxdepth 2 -name "*.log" -type f -delete

-maxdepth 2 потому что текущий каталог ",«считается первой папкой.


3
2017-11-26 17:21





Если вы находитесь в репозитории git, вы можете использовать:

git clean -fdx

Это удаляет неиспользуемые файлы и файлы в .gitignore.


0
2017-08-09 07:38