我使用find来搜索我的多媒体收藏。这之前一直有效,直到我开始添加电影预告片,所有这些都使用命名格式 -trailer。
我想使用find查找匹配*.mkv
,*.mp4
或*.avi
的所有文件,同时排除包含字符串片段"-trailer."
的所有文件,即使它匹配第一个标准(即排除文件moviename-trailer.mkv)。但是,以下内容包括结果中的所有预告片。
find . -type f -iname '*.mkv' -or -iname '*.mp4' -or -iname '*.avi' -not -iname '*trailer.*'
通过尝试首先排除所有预告片,然后搜索余数,我已经改变了搜索顺序但没有成功。
我怀疑find会遇到像* -trailer.mkv这样的文件,将其标记为true并将其打印出来,然后在达到排除它的条件之前查找下一个文件。
是否有办法在此逻辑后使用括号嵌套搜索:查找所有文件(*.mkv
或*.mp4
或*.avi
)而不是*-trailer.*
)?< / p>
非常感谢。
答案 0 :(得分:0)
duda@coolomet:~/test$ touch a.mp4
duda@coolomet:~/test$ touch a-trailer.mp4
duda@coolomet:~/test$ find . -type f -iname '*.mkv' -or -iname '*.mp4' -or -iname '*.avi' -not -iname 'trailer.'
./a.mp4
./a-trailer.mp4
duda@coolomet:~/test$ find . -type f \( -iname '*.mkv' -or -iname '*.mp4' -or -iname '*.avi' \) -and -not -iname '*trailer.*'
./a.mp4
duda@coolomet:~/test$
你需要做一个正确的逻辑表达式,并在iname参数中有适当的通配符。
答案 1 :(得分:0)
find . | grep -P '^(((?!-trailer).)*\.((mkv|avi|mp4)))$'
将返回
./movie.avi
./movie.mkv
./movie.mp4
当前目录包含文件
./movie-trailer.avi
./movie-trailer.mkv
./movie-trailer.mp4
./movie.avi
./movie.mkv
./movie.mp4