如何在 Linux 命令行中删除具有特定扩展名的文件

您可能会遇到想要删除具有特定扩展名的多个文件的情况。 本教程将帮助您做到这一点。

您可以使用 rm 命令以下列方式删除文件和文件夹:

rm [option] filename

看起来您需要在这里知道确切的文件名,但事实并非如此。

让我向您展示几种根据文件扩展名删除多个文件的方法。

方法一:使用rm命令按扩展名删除文件

在我的 example,我有一堆以 .gif 扩展名结尾的 gif 文件。

要删除它们,我可以使用 rm 命令,如下所示:

rm *.gif

像这样盲目地删除文件可能会有风险。 首先使用 ls 命令查看将删除哪些文件总是好的:

ls *.gif

以下是我删除扩展名为 .gif 的文件的方法:

$ ls
1.gif  2.gif  3.gif  4.gif  a.jpg  b.png  c.webp

$ ls *.gif
1.gif  2.gif  3.gif  4.gif


$ rm -v *.gif
removed '1.gif'
removed '2.gif'
removed '3.gif'
removed '4.gif'

$ ls
a.jpg  b.png  c.webp

这可以用于任何文件扩展名,而不仅仅是 .gif。 您甚至可以组合多个扩展。

$ ls
f1.txt  f2.txt  f3.txt  f4.txt  not-txt-file.pdf random.txt


$ rm -v *.txt *.pdf
removed 'f1.txt'
removed 'f2.txt'
removed 'f3.txt'
removed 'f4.txt'
removed 'not-txt-file.pdf'

$ ls
random.txt

?您可以使用交互式 -i 选项与 rm 命令,要求在删除每个文件之前进行确认。 但是,如果您要删除大量文件,这可能不方便。

想知道它是如何工作的? 通配符!

简而言之,通配符是用于匹配特定模式的特殊字符。 以下是一些经常使用的通配符:

威尔卡德采用
*匹配一个或多个事件
?匹配单个事件
[] (方括号)指定匹配范围
^从匹配中排除

您在这里使用了 * 通配符,这意味着它可以匹配一个或多个出现的任何字符。

当你说 *.gif它表示任何字母组合导致 .gif. 换句话说,它为您提供了所有带有扩展名的文件 .gif.

除了一个多通配符之外,还可以使用每个通配符。 但是,我们现在不要讨论这些细节。

* 和扩展名之间的那个点很重要!

很多人都犯了混淆视听的错误 *.gif*gif. 这个不对。 * 和扩展名之间的点 (.) 至关重要。

以以下文件为例,看看我使用正则表达式时会发生什么 *gif 代替 *.gif

$ ls

1.gif  2.gif  3.gif  4.gif  definately-not-a-gif  jpg-not-gif  not-a-gif


$ rm -v *gif

removed '1.gif'
removed '2.gif'
removed '3.gif'
removed '4.gif'
removed 'definately-not-a-gif'
removed 'jpg-not-gif'
removed 'not-a-gif'

它还删除了带有字符串的文件 gif 在其中,即使它不是文件的扩展名,它也只是在文件名的末尾有 gif 而没有前面的点。

当您删除带有通配符或正则表达式的文件时,请确保您尽可能准确。

方法2:使用find命令递归删除特定扩展名的文件

rm 命令只删除当前目录中的文件。 即使使用递归选项,它也不会从子目录中删除文件。

要递归删除具有特定扩展名的文件,可以结合 find 命令和 rm 命令:

这是一个 example 我在子目录中也有 .gif 文件。

$ ls *
file_0.gif  file_z.txt  not-a-gif  not-a-txt

dir1:
file_1.gif  file_a.txt  not-a-gif  not-a-txt

dir2:
file_2.gif  file_b.txt  not-a-gif  not-a-txt

dir3:
file_3.gif  file_c.txt  not-a-gif  not-a-txt

dir4:
file_4.gif  file_d.txt  not-a-gif  not-a-txt

要删除文件,您可以使用 find 命令,如下所示:

find . -type f -name "*.gif" -exec rm -v {} ;

这是我运行命令时的输出:

$ find . -type f -name "*.gif" -exec rm -v {} ;
removed './dir1/file_1.gif'
removed './dir3/file_3.gif'
removed './dir2/file_2.gif'
removed './file_0.gif'
removed './dir4/file_4.gif

让我们分解一下。

  • “find”后面的句号表示在当前目录中搜索
  • “-name”标志指定文件的名称,我们可以在其中使用正则表达式
  • “-exec”标志用于执行 bash 命令查找命令的结果
  • “{}”大括号充当匹配文件结果的占位符,因此“rm -v {}”将删除 find 命令找到的文件。
  • 最后,分号结束您的 shell 执行的命令(exec 之后的命令)并使用反斜杠 ” 以便正确转义分号。 你不应该担心这个。

您可以在下面的教程中了解更多 find 命令的示例。

高级额外提示:使用 find 命令处理具有多个扩展名的文件

上面显示的命令不包括查找具有多个扩展名的文件,例如“rm *.gif *.txt”

为此,您可以使用 -o 表示“逻辑或运算符”的参数。 但是我们还必须使用反斜杠“”来转义括号

$ ls *
file_0.gif  file_z.txt  not-a-gif  not-a-txt

dir1:
file_1.gif  file_a.txt  not-a-gif  not-a-txt

dir2:
file_2.gif  file_b.txt  not-a-gif  not-a-txt

dir3:
file_3.gif  file_c.txt  not-a-gif  not-a-txt

dir4:
file_4.gif  file_d.txt  not-a-gif  not-a-txt

$ find . ( -name "*.gif" -o -name "*.txt" ) -exec rm -v {} ;
removed './dir1/file_1.gif'
removed './dir1/file_a.txt'
removed './dir3/file_3.gif'
removed './dir3/file_c.txt'
removed './dir2/file_2.gif'
removed './dir2/file_b.txt'
removed './file_0.gif'
removed './file_z.txt'
removed './dir4/file_d.txt'
removed './dir4/file_4.gif'

在这里,您可以看到所有带有“txt”扩展名的文件和带有“gif”扩展名的文件都被递归删除了。

我知道您会觉得对每种文件扩展名类型分别使用 find 命令会更容易,而且您并没有错。

结论

本文介绍了删除具有特定扩展名的文件。 我们还研究了递归查找和删除这些文件。

“权力越大,责任越大”,使用通配符和正则表达式时请记住这一点。 一个错误类型和重要的文件可能会被无意中删除。