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

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

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

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

Но используйте его с осторожностью. Беги первым:

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

чтобы точно узнать, какие файлы вы будете удалять.

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

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

найти . -имя "*.bak" -тип f -print0 | xargs -0 /bin/rm -f

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

rm **/*.bak

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

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

sudo apt-get install gvfs     # install a tool that allows you to put stuff in the trashalias "trash"="gvfs-trash"    # you can also put this in .bash_aliases or simply use the command without aliastrash *.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 {} +

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

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

-максимальная глубина 2 потому что текущий каталог "." считается первой папкой.

Быстрый Ответ:

  • Рекурсивно удалите все файлы с указанным именем или постфиксом:

    find . -name '*.pyc' -type f -delete

  • Рекурсивно удалите все каталоги с указанным именем:

    find ~ -path '*/__pycache__/*' -delete‍‍‍find ~ -type d -name '__pycache__' -empty -delete‍‍‍

    Несколько менее жестко контролируемый, но в одной строке:

    find ~ -path '*/__pycache__*' -delete

[записка]:

d является опцией каталога и f является опцией файла.

Вы можете сначала перечислить все файлы с этим расширением, прежде чем использовать rmНапример,

ls *.bak

Если вы получаете только те файлы, которые хотите удалить, вы можете использовать rm

rm *.bak

Если вы хотите проверить список перед удалением файлов, вы можете повторить его.

find . -name "*.bak" -type f | xargs echo rm -rf

При этом будут перечислены результаты поиска, которые передаются в команду rm через xargs.Как только вы будете уверены в списке, вы можете отбросить echo в приведенной выше команде.

find . -name "*.bak" -type f | xargs rm -rf

Связанный пост - Как мне рекурсивно удалять каталоги с помощью подстановочного знака?