Linux “怎么做?”;对于每一个“;关于find的输出?

Linux “怎么做?”;对于每一个“;关于find的输出?,linux,bash,grep,find,Linux,Bash,Grep,Find,我想查找所有1920x1080的mp4文件 如果我这样做 find . -type f -name \*.mp4 -exec ffprobe '{}' \; 2>&1 它将查找所有mp4文件并显示视频信息。例如,输出是否包含(除其他行外) 我目前的想法是 find . -type f -name \*.mp4 -print0|xargs -0 -n1 echo for f in $(find . -type f -name \*.mp4); do ffprobe $f 2>

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

如果我这样做

find . -type f -name \*.mp4 -exec ffprobe '{}' \; 2>&1
它将查找所有
mp4
文件并显示视频信息。例如,输出是否包含(除其他行外)

我目前的想法是

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
如果grep-q 1920x1080和文件名中的第一个空格以及第二个空格弄乱了输出,我就不知道如何合并

问题

如果输出匹配以下内容,如何仅输出带有路径的文件名:

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

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

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

出于某种原因,if仅适用于没有空格的文件。我从未见过在
find
中使用
sh
。这是为了什么?当然,它只适用于没有空格的文件。如果您需要那个讨厌的用例,请添加双引号!(答案编辑)为什么要使用新的shell?新的shell需要处理exec'd命令中的流控制。(如果有一种方法可以在没有外壳的情况下实现这一点,我不知道。)如果我在for循环中插入
echo$file
,那么文件名会发生一些非常奇怪的事情。空格是一个问题,所有文件名都在它所连接的同一行上。根据最新的更改,输出是一个很长的行,包含所有文件名,但仍然没有正确输出的文件名。@sandraschlicting是的,我现在明白了。。似乎IFS没有像(我)预期的那样工作。我会在附近找到工作的……现在它能工作了……)非常感谢。
read-d$'\0'
技巧非常酷。谢谢!)不幸的是,我目前不确定为什么我的第一次尝试没有成功。我们将对此进行调查。。
find . -type f -name \*.mp4 -exec sh -c 'ffprobe "$0" 2>&1 |
    grep -q 1920x1080 && echo "$0"' {} \;