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

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

404 голоса | спросил user216038 15 52013vEurope/Moscow11bEurope/MoscowFri, 15 Nov 2013 17:03:34 +0400 2013, 17:03:34

5 ответов


641

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

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

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

find. -name "* .bak" -тип f

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

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

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

ответил Radu Rădeanu 15 52013vEurope/Moscow11bEurope/MoscowFri, 15 Nov 2013 17:08:01 +0400 2013, 17:08:01
32
find. -name "* .bak" -type f -print0 | xargs -0 /bin /rm -f
ответил lokers 4 PMpFri, 04 Apr 2014 23:10:25 +040010Friday 2014, 23:10:25
28

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

rm ** /*. bak

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

ответил Gilles 15 52013vEurope/Moscow11bEurope/MoscowFri, 15 Nov 2013 22:59:39 +0400 2013, 22:59:39
18

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

sudo apt-get install gvfs # установить инструмент, который позволяет помещать вещи в корзину
alias "trash" = "gvfs-trash" # вы также можете поместить это в .bash_aliases или просто использовать команду без псевдонима
мусор * .bak # мусор файлов (таким образом перемещая их в корзину мусора)

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

  

Пакет 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, который избегает не может удалить ненужные ошибки для .bak файлов внутри .bak:

find. -name '* .bak' -execdir trash {} +
ответил don.joey 15 52013vEurope/Moscow11bEurope/MoscowFri, 15 Nov 2013 17:52:01 +0400 2013, 17:52:01
3

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

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

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

ответил Hypocritus 26 72017vEurope/Moscow11bEurope/MoscowSun, 26 Nov 2017 20:21:02 +0300 2017, 20:21:02

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132