Command line 使用“查找”进行复杂和/或字符串搜索

Command line 使用“查找”进行复杂和/或字符串搜索,command-line,Command Line,我使用find脚本来搜索我的多媒体收藏。这在我开始添加电影预告片之前一直有效,所有的电影预告片都使用命名格式-trailer 我想使用find查找所有匹配*.mkv、*.mp4或*.avi的文件,同时排除任何包含字符串片段“-trailer.”,即使它匹配第一个条件(即排除文件moviename traile.mkv)。但是,以下内容包括结果中的所有拖车 find . -type f -iname '*.mkv' -or -iname '*.mp4' -or -iname '*.avi' -no

我使用find脚本来搜索我的多媒体收藏。这在我开始添加电影预告片之前一直有效,所有的电影预告片都使用命名格式-trailer

我想使用find查找所有匹配
*.mkv
*.mp4
*.avi
的文件,同时排除任何包含字符串片段
“-trailer.”
,即使它匹配第一个条件(即排除文件moviename traile.mkv)。但是,以下内容包括结果中的所有拖车

find . -type f -iname '*.mkv' -or -iname '*.mp4' -or -iname '*.avi' -not -iname '*trailer.*'
我改变了搜索顺序,但没有成功,我尝试先排除所有预告片,然后搜索其余的

我怀疑find遇到了一个文件,比如*-trailer.mkv,将其标记为true并打印它,然后在达到排除它的条件之前查找下一个文件

是否有一种方法可以按照此逻辑用括号嵌套搜索:查找所有文件(
*.mkv
*.mp4
*.avi
),而不是(
*-trail.

多谢

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参数中使用正确的逻辑表达式和通配符。

find.|grep-P'^(((?!-预告片)。*\((mkv | avi | mp4))$”

会回来的

./movie.avi
./movie.mkv
./movie.mp4
当当前目录包含文件时

./movie-trailer.avi
./movie-trailer.mkv
./movie-trailer.mp4
./movie.avi
./movie.mkv
./movie.mp4

沃基梅德洛的反应非常有效。非常感谢。