微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

删除所有在Linux中没有以下扩展名的文件

我有一个扩展名列表:

avi,mkv,wmv,mp4,mp5,flv,M4V,mpeg,mov,m1v,m2v,3gp,avchd

我想删除所有文件没有以下扩展名以及文件没有扩展名在Linux中的目录。

我如何使用rm linux命令来做到这一点?

pipe道find结果到grep的快速目录排除

是否可以将FIND的结果传送给copY命令CP?

剥离文件名bash脚本中的前导点

GNU并行的“find”和“ls”

GNU find:何时适用认操作?

在drupal语言中:grep和pipe – 列出所有发现以避免开销和服务器性能问题

如何查找具有特定长度名称的目录

使用find或grep来定位来自不同编码系统(Windows到Linux)的重音字符的文件名,

复制/ Tarring在过去14天内被修改文件

什么是* nix上最快速/最有效的查找/replace应用程序

您首先必须找出不包含这些扩展名的文件。 您可以使用find命令轻松完成此操作。 你可以建立在以下命令上 –

find /path/to/files ! -name "*.avi" -type f -exec rm -i {} ;

您也可以使用-regex而不是-name来提供复杂的搜索模式。 ! 是否定搜索。 所以它会有效地列出那些不包含这些扩展名的文件

rm -i是很好的,因为它会在删除之前列出所有的文件。 如果你的清单是全面的,那么你可以决定自己是否包含它,这可能会变得单调乏味。

使用这个删除大量的文件可能是危险的 。 一旦删除,你永远不能让他们回来。 所以在删除它们之前,确保你运行find命令而不是rm首先检查这个列表。

更新:

正如aculich的评论中aculich ,您也可以执行以下操作 –

find /path/to/files ! -name "*.avi" -type f -delete

-type f将确保它只会find和delete 常规文件 ,不会触及任何目录,sym链接

你可以使用一个快速和肮脏的rm命令来完成你想要的,但是要记住它是容易出错的,不可移植的,危险的,并且有严格的限制

正如其他人所建议的,您可以使用find命令。 我建议在几乎所有情况下都使用find而不是rm 。

既然你提到你在一个Linux系统上,我将使用在我的例子中是findutils包的一部分的GNU实现 ,因为它是大多数Linux系统的认设置,并且是我一般推荐学习的,因为它有更丰富和更多高级功能比许多其他实现。

尽管可能会令人望而生畏, 看起来过于复杂,但是花时间去掌握find命令是值得的,因为它给了你一种精确的表现力和安全性 ,你不会在大多数其他方法中找不到(不好的)重新创建命令!

查找示例

人们经常建议使用find命令来进行效率低下,容易出错和危险的方法 ,所以下面我将列出一个安全有效的方法来完成您在示例中所要求的内容

删除文件之前,我建议首先预览文件列表(或者至少是列表的一部分,如果它很长):

find path/to/files -type f -regextype posix-extended -iregex '.*.(avi|mkv|wmv|mp4|mp5|flv|M4V|mpeg|mov|m1v|m2v|3gp|avchd)$'

上述命令将显示您将要删除文件列表。 要实际删除文件,您可以简单地添加-delete动作,如下所示:

find path/to/files -type f -regextype posix-extended -iregex '.*.(avi|mkv|wmv|mp4|mp5|flv|M4V|mpeg|mov|m1v|m2v|3gp|avchd)$' -delete

如果你想看看还有什么,你可以通过添加! 到预览命令( 不带 -delete )就像这样:

find path/to/files -type f -regextype posix-extended ! -iregex '.*.(avi|mkv|wmv|mp4|mp5|flv|M4V|mpeg|mov|m1v|m2v|3gp|avchd)$'

反向匹配的输出应与执行删除操作后列出文件时所看到的输出相同,除非由于权限问题或无法写入的文件系统而发生错误

find path/to/files -type f

说明

在这里我将深入解释我选择的选项和原因:

添加了-type f来限制匹配到文件 ; 没有它将匹配非文件,如你可能不想要的目录。 还要注意,我把它放在开始而不是结束,因为谓词的顺序对于速度可能是重要的。 与-type f首先它将执行对文件的正则表达式检查,而不是对所有的事情…实际上,除非你有很多的目录或非文件,否则它可能不重要。 尽管如此,仍然值得保留谓词顺序,因为它在某些情况下会产生重大影响。

我使用不区分大小写的 -iregex选项,而不是区分大小写的-regex选项,因为我认为你想使用不区分大小写的匹配,所以它将包括.wmv .WMV文件

您可能会想要使用扩展POSIX正则表达式来简化和简洁。 不幸的是,对于-regextype posix-extended还没有一个短暂的,但即使如此,我仍然建议使用它,因为你可以避免必须添加大量的 backslashes来逃避更长,更复杂的正则表达式的问题更先进(现代)的功能。 GNU实现认为emacs风格的正则表达式 ,如果你不习惯这些正则表达式可能会引起混淆。

-delete选项应该有明显的意义,但是有时候人们建议使用更慢更复杂的-exec rm {} ; 选项,但通常是因为他们没有意识到更安全,更快速和更容易的-delete选项(在极少数情况下,您可能会遇到旧版本find旧系统没有此选项)。 知道-exec存在是有用的,但是使用-delete可以删除文件。 另外,不要管道| find到另一个程序的输出,除非你使用和理解-print0选项,否则当你遇到带有空格的文件时,你的世界会受到伤害。

我明确包含的path/to/files参数。 如果你放弃它,它会隐式使用. 作为路径,但是更安全(特别是使用-delete )来显式声明路径。

备用查找实现

即使你说你在Linux系统上,我也会提到你在包含Mac OS X的BSD实现方面遇到的不同之处! 对于其他系统(如旧的Solaris盒),祝你好运! 升级一个更现代的find变种!

这个例子中的主要区别在于正则表达式。 BSD变体认使用基本的POSIX正则表达式。 为避免在basic-PRE所需的正则表达式中额外的转义负担,您可以通过指定BSD变体的-E选项来获得与使用-regextype posix-extended的GNU变体相同的行为,从而充分利用extended-PRE的更多现代特性。

find -E path/to/files -iregex '.*.(avi|mkv|wmv|mp4|mp5|flv|M4V|mpeg|mov|m1v|m2v|3gp|avchd)$' -type f

请注意,在这种情况下, -E选项位于path/to/files 之前 ,而GNU的-regextype posix-extended选项位于路径之后。

GNU还没有提供-E选项(还是!)太糟糕了; 因为我认为这将是一个有用的选择,与BSD变体平衡我会提交一个补丁findutils添加此选项,如果它被接受,我会相应地更新这个答案。

rm – 不推荐

虽然我强烈建议不要使用rm ,但我会举例说明如何完成特定问题(有些注意事项)或多或少。

假设你使用一个Bourne语法的shell(这通常是你在Linux系统上发现的认为Bash shell的东西),你可以使用这个命令:

for ext in avi mkv wmv mp4 mp5 flv M4V mpeg mov m1v m2v 3gp avchd; do rm -f path/to/files/*.$ext; done

如果您使用Bash并且使用shopt -s extglob开启了扩展的globbing,那么您可以使用模式匹配和扩展名 :

rm -f path/to/files/*.+(avi|mkv|wmv|mp4|mp5|flv|M4V|mpeg|mov|m1v|m2v|3gp|avchd)

+(pattern-list)扩展通配符语法将匹配一个或多个出现的给定模式。

不过,我强烈建议不要使用rm因为:

这是很容易出错和危险的,因为很容易在*之间插入空格,这意味着您将删除所有内容 ; 您无法提前预览命令的结果; 这是遗忘的 ,祝好运。

它是不可移植的,因为即使它碰巧在你的特定shell中工作,同一命令行可能不能在其他shell(包括其他Bourne shell变体,如果你倾向于使用Bash-isms)中工作。

它有严格的限制,因为如果你有一个嵌套在子目录中的文件,甚至是单个目录中的大量文件,那么当使用文件通配符时,你将很快达到命令行长度的限制。

我希望rm命令只会让自己陷入遗忘,因为我可以想到我宁愿使用rm而不是(甚至是古老的) find 。

用Bash,你可以先启用extglob选项:

$ shop -s extglob

并执行以下操作:

$ rm -i!(*。avi | * .mkv | * .wmv | * .mp4)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐