当前位置: 首页 > 科技观察

linux命令行如何删除指定扩展名的文件

时间:2023-03-12 04:36:51 科技观察

我们都知道在linux中可以使用rm命令来删除文件:rm[option]filename但是,在使用上面的命令删除文件的时候,您需要知道确切的文件名。那么如何根据文件扩展名删除多个文件呢?今天我们将介绍几种方法。方法一:使用rm命令按扩展名删除文件作为演示。如果我们想删除所有扩展名为gif的文件,我们可以这样做:rm*.gif但是,一般来说,直接删除是有风险的。首先检查一下:ls*.gif通常,当我删除一个文件时,我会这样做:$ls1.gif2.gif3.gif4.gifa.jpgb.pngc.webp$ls*.gif1。gif2.gif3.gif4.gif$rm-v*.gifremoved'1.gif'删除'2.gif'删除'3.gif'删除'4.gif'$lsa.jpgb.pngc.webp另外,也可以同时删除多个扩展名的文件,如下:$lsf1.txtf2.txtf3.txtf4.txtnot-txt-file.pdfrandom.txt$rm-v*.txt*.pdfremoved'f1.txt'removed'f2.txt'removed'f3.txt'removed'f4.txt'removed'not-txt-file.pdf'$lsrandom.txt在使用rm命令时可以交互使用-i选项,这需要在删除文件之前进行确认。但是,这适用于删除单个或多个文件。如果批量删除文件,这个选项就不方便了。像上面的删除操作,它是如何工作的呢?答案是使用的通配符。简而言之,通配符是用于匹配特定模式的特殊字符。以下是一些常用的通配符:通配符用途*匹配一个或多个匹配项?匹配单个[](方括号)来指定匹配范围^Excludefrommatching在上面的删除示例中,我们使用了*通配符,这意味着它可以匹配任何字符。当您使用*.gif时,它实际上表示与.gif组合的任何字符,即它为所有文件提供了一个gif扩展名。*和扩展名之间的点很重要有人在使用通配符时这样写:*gif,这是错误的。点。*和扩展名之间是至关重要的。看看下面的例子,如果我们使用*gif删除文件会发生什么。$ls1.gif2.gif3.gif4.gifdefinitely-not-a-gifjpg-not-gifnot-a-gif$rm-v*gifremoved'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的文件,即使它不是文件的扩展名。所以,在删除带通配符或正则表达式的文件时,要尽可能精确。方法二:使用find命令递归删除特定扩展名的文件。rm命令只删除当前目录下的文件。即使使用递归选项,它也不会从子目录中删除文件。要递归地删除具有特定扩展名的文件,您可以结合使用find命令和rm命令。请参见下面的示例,该示例在子目录中也有.gif文件:$ls*file_0.giffile_z.txtnot-a-gifnot-a-txtdir1:file_1.giffile_a.txtnot-a-gifnot-a-txtdir2:file_2.giffile_b.txtnot-a-gifnot-a-txtdir3:file_3.giffile_c.txtnot-a-gifnot-a-txtdir4:file_4.giffile_d.txtnot-a-gifnot-a-txt要删除文件,可以使用find和exec命令,如下所示:-typef-name"*.gif"-exec以下是上述命令的输出:$find。-typef-name"*.gif"-execrm-v{}\;removed'./dir1/file_1.gif'removed'./dir3/file_3.gif'removed'./dir2/file_2.gif'移除'./file_0.gif'removed'./dir4/file_4.gif下面拆开解释一下:find后面的点表示在当前目录下查找;-name选项指定文件名,我们可以在里面使用正则表达式;-exec选项用于对find命令的结果执行bash命令;{}花括号作为匹配文件结果的占位符,因此rm-v{}将删除find命令找到的文件;最后,分号结束shell(exec)执行的命令,并使用反斜杠\以便正确转义分号。在以下文章中了解有关find命令的更多示例:Find命令的15个超级有用示例使用Find命令处理多个扩展名文件上面显示的命令不包括查找具有多个扩展名文件的文件,例如:rm*.gif*.txt可以使用-o参数来实现,它代表逻辑或运算符,但需要用括号括起来,括号中必须用反斜杠\转义。$ls*file_0.giffile_z.txtnot-a-gifnot-a-txtdir1:file_1.giffile_a.txtnot-a-gifnot-a-txtdir2:file_2.giffile_b.txtnot-a-gifnot-a-txtdir3:file_3.giffile_c.txtnot-a-gifnot-a-txtdir4:file_4.giffile_d.txtnot-a-gifnot-a-txt$查找。\(-name"*.gif"-o-name"*.txt"\)-execrm-v{}\;删除'./dir1/file_1.gif'删除'./dir1/file_a.txt''./dir3/file_3.gif'删除'./dir3/file_c.txt'删除'./dir2/file_2.gif'删除'./dir2/file_b.txt'删除'./file_0.gif'删除'。/file_z.txt'removed'./dir4/file_d.txt'removed'./dir4/file_4.gif'这里我们可以看到所有扩展名为txt的文件和扩展名为gif的文件都被递归移除了。您可能认为为每种文件扩展名类型使用单独的查找命令会更容易,而且它是......