【问题标题】:How to do "for each" on output from find?如何对 find 的输出执行“for each”?
【发布时间】:2013-05-06 15:19:21
【问题描述】:

我想查找所有 1920x1080 的 mp4 文件。

如果我这样做

find . -type f -name \*.mp4 -exec ffprobe '{}' \; 2>&1

它将找到所有mp4 文件并显示视频信息。例如。输出是否包含(除其他外)

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from './5432223.mp4':
Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1920x1080, 1744 kb/s, 29.97 fps, 29.97 tbr, 60k tbn, 59.94 tbc

我目前的想法是

find . -type f -name \*.mp4 -print0|xargs -0 -n1 echo
for f in $(find . -type f -name \*.mp4); do ffprobe $f 2>&1 | grep 1920x1080;done

我不知道如何将if grep -q 1920x1080 合并到第一个和第二个文件名中的空格会混淆输出。

问题

如果输出匹配1920x1080,我如何只输出带有路径的文件名?

【问题讨论】:

    标签: linux bash grep find


    【解决方案1】:

    类似这样的:

    find -type f -name "*.mp4" -print0 | while read -d $'\0' file
    do
        ffprobe "$file" 2>&1 | grep -q 1920x1080 
        # grep will return zero if the pattern was found:
        if [ $? = 0 ] ; then
            echo "$file"
        fi  
    done
    

    【讨论】:

    • 如果我在 for 循环中插入 echo $file ,那么文件名会发生一些非常奇怪的事情。空格是个问题,所有文件名都在它接缝的同一行上。
    • 随着最新的变化,输出是很长的一行,包含所有文件名,但仍然没有正确输出的文件名。
    • @SandraSchlichting 是的,我现在看到了.. 似乎 IFS 不能像(我)预期的那样工作。会找到解决办法....
    • 现在可以使用 =) 非常感谢。 read -d $'\0' 技巧非常酷。
    • 谢谢! :) 不幸的是,我目前不确定为什么我的第一次尝试没有奏效。将对此进行调查..
    【解决方案2】:

    您可能想要执行一个 shell。比如:

    find . -type f -name \*.mp4 -exec sh -c 'ffprobe "$0" 2>&1 |
        grep -q 1920x1080 && echo "$0"' {} \;
    

    【讨论】:

    • 出于某种原因,如果仅适用于没有空格的文件。我从未见过shfind 中使用。这有什么用?
    • 当然它只适用于没有空格的文件。如果您需要那个可恶的用例,请添加双引号! (答案已编辑)
    • 你怎么用新的shell?
    • 需要新的 shell 来处理 exec'd 命令中的流控制。 (如果有办法在没有外壳的情况下做到这一点,我不知道。)
    猜你喜欢
    • 2018-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-29
    • 1970-01-01
    • 2015-06-17
    • 1970-01-01
    相关资源
    最近更新 更多