2016-07-22 92 views
0

我有一系列包含多個mp3文件的目錄,文件名爲001.mp3,002.mp3,...,030.mp3。在執行命令之前排序find的輸出-exec

我想要做的就是把它們放在一起整理成一個mp3文件並添加一些元數據。

這就是我目前所面對的(除去一些變量定義,爲清楚起見):

#!/bin/bash 
for d in */; do 
    cd $d 
    find . -iname '*.mp3' -exec lame --decode '{}' - ';' | lame --tt "$title_prefix$name" --ty "${name:5}" --ta "$artist" --tl "$album" -b 64 - $final_path"${d%/}".mp3 
    cd .. 
done 

有時候這工作,我也得到以正確的順序所有的「軌道」的單個文件。

但是,更多的時候,我會以相反的順序得到一個包含所有「曲目」的單個文件,這實際上並不好。

我不明白的是,爲什麼順序在腳本的不同運行之間變化,因爲所有目錄都包含相同的一組文件名。我倒過了手冊頁,找不到排序選項。

我可以運行find . -iname '*.mp3' | sort -n >> temp.txt將文件放到一個臨時文件中,然後嘗試循環,但我無法得到與跛腳一起工作。

有沒有什麼辦法可以在找到之前進行排序運行exec?我可以通過-exec ls在這裏和其他地方找到大量的例子,但不是在那裏需要執行exec更復雜的事情。

+0

在這裏推動我自己的bash能力的邊界,但我可以做些什麼,比如'find。 -iname'* .mp3'| sort -n | xargs '?如果是的話,我將如何重新安排lame命令來進行輸入? – yknivag

+0

temp.txt包含完整路徑還是隻包含一系列文件名? –

+0

如果可能,我寧願不使用臨時文件。但它可能被構造爲包含任何類型的文件名。 – yknivag

回答

1
find . -iname '*.mp3' -print0 | sort -zn | xargs -0 -I '{}' lame --decode '{}' - | lame --tt "$title_prefix$name" --ty "${name:5}" --ta "$artist" --tl "$album" -b 64 - $final_path"${d%/}".mp3 

未經測試,但可能值得一試。

通常,xargs將參數追加到您給它的命令的末尾。 -I選項告訴它替換給定的字符串(在這種情況下爲{})。


編輯:我已經添加-print0-z-0,以確保管道仍然有效,即使你的文件名包含換行符。

+0

將'sort -n'改爲'sort -zn',因爲默認排序返回換行符分隔的記錄 – oakymax

+0

我不能建議編輯 - 至少應該添加6個符號)) – oakymax

+0

@melpomene謝謝!這工作完美。 – yknivag