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

use*_*038 735 command-line files rm batch

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

Rad*_*anu 1181

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

find . -name "*.bak" -type f -delete
Run Code Online (Sandbox Code Playgroud)

但请谨慎使用。先运行:

find . -name "*.bak" -type f
Run Code Online (Sandbox Code Playgroud)

以准确查看您将删除哪些文件。

另外,请确保这-delete是命令中的最后一个参数。如果你把它放在之前-name *.bak argument,它会删除一切。

查看man find和man rm了解更多信息,并在 SE 上查看此相关问题:

  • **确保** `-delete` 是您命令中的最后一个参数。如果你把它放在 `-name *.bak` 参数之前,*它将删除所有内容。* (54认同)
  • @ Bolt64 您的 `rm *.bak` 不适用于子目录。 (21认同)
  • @Hennes 小心`rm -r *.bak`!它还会删除以“.bak”结尾的目录及其所有内容。 (14认同)

lok*_*ers 51

find . -name "*.bak" -type f -print0 | xargs -0 /bin/rm -f
Run Code Online (Sandbox Code Playgroud)

  • 这种替代解决方案适用于缺少 -delete 的其他环境(如 cygwin) (17认同)
  • 这不仅是一种替代方法,而且是如何将其他命令与管道“|”组合在一起的示例。+1 (13认同)
  • 您可能是对的,这只是一种替代解决方案,也许更原始;) (2认同)
  • 我认为这是这里最好的答案。 (2认同)

Gil*_*il' 44

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

rm **/*.bak
Run Code Online (Sandbox Code Playgroud)

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


don*_*oey 23

删除文件对我来说不是你应该使用的东西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)
Run Code Online (Sandbox Code Playgroud)

正如 Flimm 在评论中所说:

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

所以:

sudo apt-get install trash-cli
Run Code Online (Sandbox Code Playgroud)

您不需要为此创建别名,因为该trash-cli包提供了一个 command trash,它可以执行我们想要的操作。

正如 Eliah Kagan 在大量评论中明确指出的那样,您也可以使用find. 在这种情况下你不能使用别名,所以下面的命令假设你已经安装了trash-cli. 我总结了以利亚的评论:

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

find . -name '*.bak' -xtype f
Run Code Online (Sandbox Code Playgroud)

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

find . -name '*.bak' -xtype f -exec trash {} +
Run Code Online (Sandbox Code Playgroud)

-xtype f选择文件和文件的符号链接,但不选择文件夹。要删除 .bak 文件夹,请删除该部分,然后使用-execdir,这样可以避免目录中的文件cannot trash non-existent出错:.bak.bak

find . -name '*.bak' -execdir trash {} +
Run Code Online (Sandbox Code Playgroud)

  • “不要使用 `rm` 来删除东西”是一个有争议的声明,但我必须同意使用可以让你撤消的东西通常更明智。 (7认同)
  • 包 `trash-cli` 与 `gvfs-trash` 做同样的事情,而不依赖于 `gvfs`。 (2认同)

小智 6

如果要删除某种类型的所有文件,但仅从当前文件夹“深层”删除 1 个文件夹:

find . -maxdepth 2 -name "*.log" -type f -delete
Run Code Online (Sandbox Code Playgroud)

-maxdepth 2因为当前目录“ . ”算作第一个文件夹。


Ben*_*ari 6

快速回答:

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

    \n\n

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

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

    \n\n
    find ~ -path '*/__pycache__/*' -delete\xe2\x80\x8d\xe2\x80\x8d\xe2\x80\x8d\nfind ~ -type d -name '__pycache__' -empty -delete\xe2\x80\x8d\xe2\x80\x8d\xe2\x80\x8d\n
    Run Code Online (Sandbox Code Playgroud)\n\n

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

    \n\n
    find ~ -path '*/__pycache__*' -delete\n
    Run Code Online (Sandbox Code Playgroud)
  • \n
\n\n
\n\n

[笔记]:

\n\n

d是目录选项并且f是文件选项。

\n