您可能会遇到想要删除具有特定扩展名的多个文件的情况。 本教程将帮助您做到这一点。
您可以使用 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 命令会更容易,而且您并没有错。
结论
本文介绍了删除具有特定扩展名的文件。 我们还研究了递归查找和删除这些文件。
“权力越大,责任越大”,使用通配符和正则表达式时请记住这一点。 一个错误类型和重要的文件可能会被无意中删除。