Как мне безопасно удалить все файлы с определенным расширением (например .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__/*' -deletefind ~ -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