2011-11-19 135 views
3

我想出了這個文件擴展名:Linux命令給目錄中的所有文件

for i in *; 
do input=`echo $i|sed -e 's/[ ]/\\\ /g'`; 
output=`echo $input".mp3"`; 
mv $input $output; done 

它非常接近,但MV抱怨:

MV:無效選項 - 「 \'

我不明白爲什麼它不起作用,如果我嘗試echo $輸入或$輸出,他們似乎都正確地轉義文件名中的所有空格,沒有更多。

回答

4

看起來你是大量過於複雜與您使用的sed(和echo)這個......

你試圖逃跑文件名中的空格字符,但你真的只是需要用引號括起文件名。你可以簡單地做......

for i in *; do 
    mv "${i}" "${i}.mp3" 
done 
+0

謝謝。它看起來像我的東西是複雜的。 :-) –

+0

當然,如果文件名中有引號,這將不起作用; -P。而且由於bash使用空格來分隔數組元素,因此使用空格的文件名會嚴重破壞它。 – Borealid

9

find . -type f -exec mv "{}" "{}.mp3" \;

+3

這子目錄更改文件,以及可能會或可能不會是什麼OP想。問題示例不會遍歷目錄。限制爲當前目錄使用'-maxdepth'選項。 –

2

更短,更安全:

for i; do 
    mv -- "${i}" "${i}.mp3" 
done 

=)

--照顧的劃線開頭的文件

for i in *縮短了for i

使用更多的引語:它們是至關重要的。另外,瞭解',"`之間的區別。見http://mywiki.wooledge.org/Quoteshttp://wiki.bash-hackers.org/syntax/words。 (句子從IRC freenode上#bash被盜)

+0

呃......我用雙引號。 – Johnsyweb

+0

不,看到「mv $ input $ output; done」應該是「mv」$ input「」$ output「; done」 –

+0

我覺得你讓我迷惑西蒙貓的問題(我只是改正了標題中的拼寫錯誤)答案(它既不使用$輸入也不使用$輸出)。 – Johnsyweb

1

使用rename,它使這些事情很簡單:

rename 's/$/.mp3/' * 
+3

你應該照顧不同版本的重命名。這是perl之一。如果命令「file $(type -p rename)」顯示「ELF」,則表示錯誤;) –

1
for i in *; do mv -- ${i}{,.mp3};done 
相關問題