如何递归删除当前目录中特定扩展名的所有文件?


531

如何.bak使用一个命令行从当前目录和所有子文件夹中安全删除所有具有特定扩展名的文件(例如)?简而言之,我害怕使用,rm因为我曾经错误地使用过它,现在我需要建议。

Answers:


840

rm如果您害怕,甚至不需要在这种情况下使用。用途find

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

但是请谨慎使用。首先运行:

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

查看要删除的文件。

另外,请确保这-delete命令中的最后一个参数。如果将其放在之前-name *.bak argument它将删除所有内容

请参阅man find和,man rm以获取更多信息,以及有关SE的相关问题:


这与有rm *.bak什么不同?
sayantankhan 2013年

10
@ Bolt64您rm *.bak将不适用于子目录。
RaduRădeanu13年

使用默认设置rm *.bak只会删除当前目录中所有以.bak结尾的文件。要在子目录中执行某些操作,您可能需要弄乱glob,使用-r选项或使用find示例。
Hennes

9
@Hennes要小心rm -r *.bak!它还会删除.bak以所有内容结尾的目录。
RaduRădeanu2013年

37
确保-delete是命令中的最后一个参数。如果将其放在-name *.bak参数之前,它将删除所有内容。
2014年

40
find . -name "*.bak" -type f -print0 | xargs -0 /bin/rm -f

1
欢迎来到askubuntu!虽然这是一个非常有效的答案,但我认为使用它代替的-delete标志没有任何优势find。可在GNU手册条目中找到更多信息,以使用find删除文件
Glutanimate 2014年

2
您可能是对的,这只是另一种解决方案,也许更原始;)
lokers 14-4-4

11
这不仅是一个替代方案,而且是一个示例如何将其他命令与管道“ |”组合在一起的示例。+1
鲍里斯·帕夫洛维奇(BorisPavlović)2014年

13
此替代解决方案可在缺少-delete的其他环境(例如cygwin)上工作
ciriarte 2014年

2
我认为这是最好的答案。
莱奥波尔德·赫兹(LéoLéopoldHertz)2015年

33

首先运行命令shopt -s globstar。您可以在命令行上运行该命令,它仅在该shell窗口中有效。您可以将其放入您的中.bashrc,然后所有新启动的shell都会将其拾取。该命令的作用是**/递归地在当前目录及其子目录中创建匹配文件(默认情况下,**/它与*/:的含义相同,仅在直接子目录中)。然后:

rm **/*.bak

(或gvfs-trash **/*.bak您拥有什么)。


21

对我来说,删除文件不是您应该使用的东西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)

如Flimm在评论中所述:

该软件包的trash-cli功能与gvfs-trash不依赖gvfs的功能相同。

所以:

sudo apt-get install trash-cli

您不需要为此设置别名,因为trash-cli程序包提供了一个command trash,它可以完成我们想要的操作。

正如Eliah Kagan在大量评论中明确指出的那样,您还可以使用进行递归find。在这种情况下,您不能使用别名,因此以下命令假定您已安装trash-cli。我总结了以利亚的评论:

此命令.bak在当前目录或其子目录中或以下的任何位置查找并显示所有文件和符号链接。

find . -name '*.bak' -xtype f

要删除它们,请-exectrash命令后附加一个:

find . -name '*.bak' -xtype f -exec trash {} +

-xtype f选择文件并符号链接到文件,但不选择文件夹。要同时删除.bak文件夹,请删除该部分并使用-execdir,这样可以避免目录内文件的cannot trash non-existent错误:.bak.bak

find . -name '*.bak' -execdir trash {} +

4
“不使用rm删除内容”是一个有争议的说法,但我必须同意,使用可以让您撤消操作的东西通常更明智。
奥利

2
该软件包的trash-cli功能与gvfs-trash不依赖的功能相同gvfs
Flimm

我已经在答案中对其进行了编辑,下次您可以自己进行编辑。
don.joey

@ don.joey这个答案似乎表明删除了find . -name "*.bak" -type f什么trash *.bak那真的是你的意思吗?您可以使用trash或将目录移到回收站gvfs-trash,但trash *.bak只会移动名称以结尾.bak并且直接位于当前目录中的文件和目录。外壳会扩展*.bak,因此trash *.bak不会影响.bak本身没有命名的子目录中的文件.bak
伊莱亚·卡根

1
@ don.joey是ls *.bak(我认为您的意思是)列出了哪些trash *.bak垃圾内容。find . -name '*.bak' -xtype f -exec trash {} +将所有.bak文件删除到下的任何位置.。它不能使用别名,因此请安装trash-cli或编写gvfs-trash这是一个例子。 -xtype f选择文件并符号链接到文件,但不选择文件夹。要删除.bak 文件夹find . -name '*.bak' -execdir trash {} +,也可以使用,这样可以避免目录内文件cannot trash non existent出错。请随时在您的答案中使用任何一个。.bak.bak
伊莱亚·卡根

5

如果要删除某个类型的所有文件,但是从当前文件夹中仅删除一个“ deep”文件夹:

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

-maxdepth 2,因为当前目录“ ”被视为第一个文件夹。


1

快速回答:

  • 递归删除所有具有考虑名称或后缀的文件:

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

  • 递归删除所有具有考虑名称的目录:

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

    不太严格的控制,但在一行中:

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

[ 注意 ]:

d是目录选项,f是文件选项。


0

如果您位于git仓库中,则可以使用:

git clean -fdx

这将删除未跟踪的文件和.gitignore中的文件。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.