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

Две команды, которые я использую для получения информации о пакете, это

Первый

apt-cache policy <package name>

Второй

Вторая команда более подробная, и я использую ее много.

1
задан 15 November 2013 в 22:16

4 ответа

[F1]
32
ответ дан 24 May 2018 в 15:14
  • 1
    Добро пожаловать в askubuntu! Хотя это вполне правильный ответ, я не думаю, что есть преимущество в использовании этого вместо флага -delete в find. Более подробную информацию можно найти в записи руководства GNU для удаления файлов с помощью find . – Glutanimate 5 April 2014 в 01:11
  • 2
    вы, вероятно, правы, это просто альтернативное решение, возможно, более сырое;) – lokers 5 April 2014 в 03:13
  • 3
    Это не просто альтернатива, а пример того, как другие команды могут быть объединены вместе с трубой '|'. +1 – Boris Pavlović 5 June 2014 в 12:18
  • 4
    Эти альтернативные решения работают в других средах, где отсутствует -delete (например, cygwin) – ciriarte 15 August 2014 в 09:07
  • 5
    Я думаю, что это лучший ответ. – Léo Léopold Hertz 준영 29 June 2015 в 14:27

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

rm **/*.bak

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

26
ответ дан 24 May 2018 в 15:14

Удаление файлов для меня не является чем-то, что вы должны использовать 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. Я суммирую комментарии Eliah:

Эта команда находит и отображает все .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
ответ дан 24 May 2018 в 15:14
  • 1
    msgstr "Не использовать rm для удаления вещей " это противоречивое утверждение, но я должен согласиться с тем, что часто разумнее использовать что-то, что позволит вам отменить все. – Oli♦ 15 November 2013 в 21:12
  • 2
    Пакет trash-cli выполняет ту же функцию, что и gvfs-trash, без зависимости от gvfs. – Flimm 20 November 2013 в 15:08
  • 3
    Я отредактировал его в ответе, в следующий раз не стесняйтесь делать редактирование самостоятельно. – don.joey 20 November 2013 в 16:06
  • 4
    @ don.joey Этот ответ кажется, что find . -name "*.bak" -type f показывает, что trash *.bak удаляет. Это действительно то, что вы имеете в виду? Вы можете переместить каталоги в корзину с помощью trash или gvfs-trash , но trash *.bak будет только перемещает файлы и каталоги, имена которых заканчиваются на .bak и которые находятся непосредственно в текущем каталоге. Оболочка расширяет *.bak, поэтому trash *.bak не будет влиять на файлы .bak в подкаталогах, которые сами не называются .bak. – Eliah Kagan 14 October 2017 в 05:30
  • 5
    @EliahKagan хорошее место. Да, в этом случае ls .*bak будет лучше. Или у вас есть альтернатива, которая делает trash рекурсивной? – don.joey 14 October 2017 в 16:23

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

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

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

3
ответ дан 24 May 2018 в 15:14

Другие вопросы по тегам:

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