使用find进行复杂的AND / OR字符串搜索

时间:2018-04-15 20:15:58

标签: command-line

我使用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>

非常感谢。

2 个答案:

答案 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