linux - BASH:通过另一个命令的返回值过滤文件列表
问题描述
我有一系列目录,其中包含(大部分)视频文件,比如说
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。我可以做一个 for next 循环,但这似乎是一个坏(慢)的主意。
使用来自@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
表示逻辑 OR):
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' _ {} \;
所以,注意到@tripleee 在关于多余exit
陈述的评论中的建议,我明白了:
find test1 test2 -type f \
\( -iname "*.mpg" -o -iname "*.avi" -o -iname "*.mpeg" \) \
-exec bash -c 'h=$(mediainfo ...options... "$1"); [ $h -lt 480 ]' _ {} \; -print
推荐阅读
- matlab - CVX 中的问题表述 - MATLAB 2020b
- python - mitmdump 错误:Windows 中的 select() 问题中的文件描述符过多
- java - 读取文件json并转换为字符串并替换java8中的字符
- keycloak - Keycloak 15 中远程和本地 Infinispan 版本不匹配
- batch-file - 尝试记录输出时的变量问题
- rust - 尝试从单独的函数获取数据库连接和 tx 时的所有权/借用问题
- python - 历史模型在恢复 django 数据迁移时不允许删除
- unit-testing - 如何在 Quarkus 上的 Mutiny 中测试轮询模式?
- python - 尝试单击 Helium/Selenium 页面上的多个可见元素时出现查找错误
- python - 如何确定属于封闭区域(ezdxf)的所有实体(弧线、线)