gpt4 book ai didi

linux - BASH : Filter list of files by return value of another command

转载 作者:行者123 更新时间:2023-12-03 10:01:27 25 4
gpt4 key购买 nike

我有一系列包含(大部分是)视频文件的目录,例如

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。
我可以为下一个循环做一个准备,但这似乎是个坏主意。

使用来自@ mark-setchell的信息,我将其修改为
video_dir="test1"

find ${video_dir} -type f \
-exec bash -c 'h=$(mediainfo --Output="Video;%Height%" "$1"); [[ $h -gt 480 ]]' _ {} \; -print

哪个有效。

最佳答案

您可以将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' _ {} \;

因此,在有关多余的 exit语句的注释中记下@tripleee建议,我得到以下信息:
find test1 test2 -type f                                       \
\( -iname "*.mpg" -o -iname "*.avi" -o -iname "*.mpeg" \) \
-exec bash -c 'h=$(mediainfo ...options... "$1"); [ $h -lt 480 ]' _ {} \; -print

关于linux - BASH : Filter list of files by return value of another command,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59699174/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com