2012-05-25 548 views
0

我想在一些視頻上自動執行修復索引的過程。以下是我的代碼。命令在Linux終端中運行,但不在bash腳本中

for f in ~/Videos/Temp/* 
do 
    f=$(echo $f | sed 's/ /\\ /g') 
    name=$(echo $f | sed 's/Temp/Fixed/1') 
    mencoder -forceidx "$f" -o "$name" -oac copy -ovc copy 
done 

我遇到的問題是mencoder聲稱它無法在變量$ f中找到文件存儲。

MEncoder svn r34540 (Ubuntu), built with gcc-4.6 (C) 2000-2012 MPlayer Team 
File not found: '/home/name/Videos/Temp/file\ name.avi' 
Failed to open /home/bryan/Videos/Temp/file\ name.avi. 
Cannot open file/device. 

Exiting... 

當我用擴展變量將命令打印到終端並運行它時,它工作得很好。我甚至修改了我的上面的代碼來打印出修復每個視頻的命令,將它們粘貼到一個新的腳本中,並且一切正常。我在Ubuntu上運行這個。任何想法可能會導致這種情況?

+0

你不需要逃避你的空間,因爲你(正確地)在變量周圍使用引號。也許這是問題的一部分?您可能還想檢查您的終端是否也使用bash作爲它的外殼。 – mivk

+0

@mivk:除了在賦值給'name'的時候變量沒有被引用。變量在擴展時應始終引用(如您所知)。 –

+1

是什麼導致它(如你所知)是文件名中的空格。最好的解決方案是重命名所有文件,以便它們不包含空格。允許路徑中的空白是文件系統維護者的糟糕的設計決定。在路徑中使用空格是荒謬的。要求文件系統支持它們應該是一種死罪。 –

回答

0


    find ~/Videos/Temp/ -type f -print0 | while IFS= read -r -d $'\0' f; do 
     name=$(echo "$f" | sed 's/Temp/Fixed/1') 
     mencoder -forceidx "$f" -o "$name" -oac copy -ovc copy 
    done 

+0

在腳本中最好使用完整路徑,以防萬一您想要稍後安排它。 – Bram

+0

的確如此。我通常在腳本的開頭將相對路徑轉換爲完整路徑。 –

+0

'$ f'應在第二行中引用。 –

1

正如其他人指出的那樣,您不需要手動轉義文件名中的空格。但是,您也不需要使用sed來修改路徑。

for f in ~/Videos/Temp/* 
do 
    mencoder -forceidx "$f" -o "${f/Temp/Fixed}" -oac copy -ovc copy 
done 

只有第一次出現的「Temp」被替換爲「Fixed」,因此您不必擔心文件名中的意外替換。

相關問題