2016-06-19 98 views
2

我有一個包含.flac文件的多個子目錄的目錄。我想批量轉換它們到.mp3。路徑名稱包含空格。現在我想要做這樣的事情在多個目錄中查找批處理文件

find . -type f -regex .*.flac -exec ffmpeg -i {} -c:a mp3 -b:a 320k \; 

但問題是,我該如何使用mp3{}和替代flac給ffmpeg的輸出文件名?在bash中,可以使用變量替換${file%.flac}.mp3,但我不能在這裏應用。基於sed的方法似乎也不適用於find。 有沒有簡單的解決方案呢?

+1

Btw。報價'* .flac'。 – Cyrus

回答

3

如果你正在使用bash,我會使用globstar,這將擴大到所有.flac文件的列表:

shopt -s globstar nullglob 
for file in **/*.flac; do 
    [[ -f $file ]] || continue 
    out_file=${file%.flac}.mp3 
    ffmpeg # your options here, using "$out_file" 
done 

支票[[ -f $file ]]跳過,在.flac結尾的所有目錄。如果你沒有這些,你可以跳過這個。

我也啓用了nullglob shell選項,以便與任何文件不匹配的模式展開爲空(因此循環將不會運行)。

+0

那麼你應該得到我的加號':)'。 –

2

如果你真的想要使用find(例如,你用Bash的古董版卡在過去,globstar不可用 - 所以使用Tom Fenech的解決方案不是一種選擇),你必須產生一個shell來做替換。該標準的方式是:

find . -name '*.flac' -type f -exec sh -c 'ffmpeg -i "$1" -c:a mp3 -b:a 320k "${1%.flac}.mp3"' dummy {} \; 

sh -c將運行第一個參數,和子序列參數被設置爲位置參數0開始。這就是爲什麼我把一個虛擬參數(我稱之爲dummy,但其他任何東西都可以)。

請注意,在find-name中,需要引用參數*.flac。出於某種原因,你編輯了你的帖子,並用謂詞-regex謂詞替換了謂詞:它實際上是無用的,你仍然需要引用這個論點。

+0

是不可能寫'sh -c'ffmpeg -i「$ 0」-c:一個mp3 -b:一個320k「$ {1%.flac} .mp3」'{} \;' –

+1

@mona_sax:nope ,因爲在這種情況下,位置參數'$ 1'沒有被設置,所以這不是很有效!也許你的意思是:'sh -c'ffmpeg -i「$ 0」-c:一個mp3 -b:一個320k「$ {0%.flac} .mp3」'{} \;',這是完全有效的。 –

+1

嗯是的!我的意思不是你剛纔指出的。 :)。我想避免使用虛擬變量。這實際上是一個優雅的單線:) +1 –

相關問題