我有一组目录(在当前目录中),我正在对其中的文件进行排序。源文件位于当前目录或其他目录中(通常是很多级别),它也包含在内。
我获取要使用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)'
...还有一个最后的问题:如何使文件选择正则表达式不敏感?
答案 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
是实现不区分大小写的唯一方法。