BASH:按另一个命令的返回值过滤文件列表

问题描述 投票:0回答:1

我有一系列目录,其中包含(主要是)视频文件

test1
  1.mpg
  2.avi
  3.mpeg
  junk.sh
test2
  123.avi
  432.avi
  432.srt
test3
  asdf.mpg
  qwerty.mpeg

我用目录名(基于其他参数)创建一个变量(video_dir),并将其与find一起使用以生成基本列表。然后,我根据另一个变量(video_type)筛选文件类型(因为目录中有时存在非视频文件),并通过egrep对其进行过滤。然后,我重新整理列表,然后将其保存到文件中。后来mplayer使用该文件在列表中进行幻灯片显示。我目前使用以下命令来完成该任务。我敢肯定这是一种可怕的方法,但是它对我有用,即使在大目录下也非常快。

video_dir="/test1 /test2"
video_types=".mpg$|.avi$|.mpeg$"

find ${video_dir} -type f    |
  egrep -i "${video_types}"  |
  shuf > "$TEMP_OUT"

我现在想添加基于视频文件的分辨率高度过滤出文件的功能。我可以从中得到。

mediainfo --Output='Video;%Height%' filename

这只是返回一个数字。我尝试使用find的-exec功能在每个文件上运行该命令。

 find ${video_dir} -type f -exec mediainfo --Output='Video;%Height%' {} \;

但是那只是返回高度列表,而不是文件名,我不知道如何基于比较来拒绝高度,例如<480。我可以为下一个循环做一个准备,但是这似乎是个坏主意。

linux bash find command pipe
1个回答
0
投票

不是在计算机上,所以未经测试,但可能很近...

您可以将以下内容替换为egrep,因此您仍在find命令中(-iname不区分大小写,-o表示逻辑或):

find test1 test2 -type f                                      \
     /( -iname "*.mpg" -o -iname "*.avi" -o -iname "*.mpeg \) \
     NEXT_BIT

然后,NEXT_BIT可以-exec bash并以状态0或1退出,具体取决于您要包含还是排除当前文件。所以它看起来像这样:

-exec bash -c 'H=$(mediainfo -output ... "$1"); [ $H -lt 480 ] && exit 1; exit 0' _ {} \;

对不起,我明天才能考试。

© www.soinside.com 2019 - 2024. All rights reserved.