找到-type -regex和-prune

时间:2016-02-07 16:13:42

标签: regex bash

我有一组目录(在当前目录中),我正在对其中的文件进行排序。源文件位于当前目录或其他目录中(通常是很多级别),它也包含在内。

我获取要使用find处理的文件列表,使用-type -regex和-prune排除目标目录中的文件,然后使用另一个-regex选择文件。

至少,我想要的是什么,文件列表是正确的 - 有一个例外:目标目录出现在列表中(但不是它们已经包含的文件 - 这是所需的行为)。

我有一个解决方法:在后续循环中,我丢弃任何不属于文件的内容。

我确信在目录排除正则表达式中有一个简单的错误我错过了-prune应该做的事情。

这是我的代码(我正在使用Mac - 因此是-E选项):

find -E . \
-type d -regex './(DVD|quarantine|720|high|low|error)' -prune -o \
-type f -regex '.*.(avi|wmv|mp4|m4v|mov|mkv)'  

...还有一个最后的问题:如何使文件选择正则表达式不敏感

1 个答案:

答案 0 :(得分:3)

以下是find手册页的相关部分:

 -print  This primary always evaluates to true.  It prints the pathname of the current file to standard output.  If
         none of -exec, -ls, -print, -print0, or -ok is specified, the given expression shall be effectively replaced
         by ( given expression ) -print.

因此,因为您的命令行没有指定-exec-ls-print-print0-ok,所以它就像是你的命令是:

find -E . \
\( -type d -regex './(DVD|quarantine|720|high|low|error)' -prune -o \
   -type f -regex '.*.(avi|wmv|mp4|m4v|mov|mkv)' \) -print

解决方案是-print右侧的明确-print0(或-o):

find -E . \
-type d -regex './(DVD|quarantine|720|high|low|error)' -prune -o \
-type f -regex '.*\.(avi|wmv|mp4|m4v|mov|mkv)' -print

此外,正如评论中所提到的,使用-iregex可以使正则表达式不区分大小写。

或者,如果您愿意,还可以在表达式本身中嵌入不区分大小写(请参阅re_format手册页):

find -E . \
-type d -regex './(?i:DVD|quarantine|720|high|low|error)' -prune -o \
-type f -regex '.*\.(?i:avi|wmv|mp4|m4v|mov|mkv)' -print

编辑:不,-iregex是实现不区分大小写的唯一方法。