2013-05-12 49 views
4

我想找到全部爲1920x1080的mp4文件。如何在find中輸出「for each」?

如果我做

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

回答

2

你可能想給exec一個shell。例如:

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

由於某種原因,如果只適用於沒有空格的文件。我從來沒有見過'sh'被用在'find'中。這開放了什麼? – 2013-05-12 13:45:02

+0

當然,它只適用於沒有空格的文件。如果您需要這個可惡的用例,請添加雙引號! (回答編輯) – 2013-05-12 13:46:36

+0

你怎麼使用一個新的外殼? – 2013-05-12 13:51:53

3

事情是這樣的:

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 
+0

如果我在for循環中插入'echo $ file',那麼文件名就會出現一些非常奇怪的現象。空格是一個問題,並且所有文件名都在它接縫的同一行上。 – 2013-05-12 14:12:27

+0

隨着最新的變化,然後輸出是一個非常長的行與所有的文件名,仍然沒有正確輸出的文件名。 – 2013-05-12 15:44:39

+0

@SandraSchlichting是的,我現在看到..似乎IFS不工作(我有)預期。將找到解決...... – hek2mgl 2013-05-12 17:07:33