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

371

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

    
задан user216038 15.11.2013 в 14:03
источник

5 ответов

582

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

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

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

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

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

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

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

ответ дан Radu Rădeanu 15.11.2013 в 14:08
источник
30
find . -name "*.bak" -type f -print0 | xargs -0 /bin/rm -f
    
ответ дан lokers 04.04.2014 в 21:10
23

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

rm **/*.bak

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

    
ответ дан Gilles 15.11.2013 в 19:59
18

Удаление файлов для меня не является чем-то, что вы должны использовать 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 {} +
    
ответ дан don.joey 15.11.2013 в 14:52
1

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

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

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

    
ответ дан Hypocritus 26.11.2017 в 18:21