2011-11-24 17 views
0

最近我一直在組織我的音樂庫,我試圖讓所有「看起來」都一樣。我的所有歌曲應該看起來像04 John Barleycorn.m4a,但其中一些來自多磁盤組,看起來像2-04 John Barleycorn.m4a。所以我馬上想:「爲什麼不做一個bash腳本來爲我做這些乏味的工作?」我不知道,我會花更多的時間來找出這個「缺陷」,而不是手工完成這個工作。只有一個小的區別:我不會學習任何手工操作!爲什麼我可以在終端窗口中執行命令,但在bash腳本中遇到錯誤?

因此,這裏是我的腳本:

#!/bin/bash 

filename="/tmp/fileout.txt" 

find . -name '?-*.???' > $filename 

cat $filename | while read line 
do 
    echo ${line:1} 
    newname=$(echo ${line%\/*}/${line#*-}) 
    echo $newname 
    #mv \"$line\" \"$newname\" 
done 

它應該是足夠簡單了吧?它找到所有具有多磁盤格式的文件,並將它們放入一個文本文件中。每一行然後被讀回,重新格式化,並被「移動」到其新的位置/文件名稱。 (有些部分被註釋掉了,因爲我希望在移動文件之前確保事物「看起來」很好)。但是,當我第一次嘗試它時(在「看起來很好」並刪除mv前面的#)後,我一直得到

mv: target `Barleycorn.m4a"' is not a directory 

我認爲這是因爲空間沒有被轉義。我認爲引用它可以解決它,但顯然不是。

但我會盡力在稍後解決。這是我的越野車問題。我想刪除文件名的第一個字符(一期)(只是舉個例子......我真的不需要以任何理由這樣做):

line="./Traffic/Smiling Phases/04 John Barleycorn.m4a" 
echo ${line:1} 

作品只需鍵入罰款在命令行中。

但在bash腳本,它會迴應:

/home/kyleowen/filerenamer.sh: 15: Bad substitution 

我用花括號內${var//foo/bar/}和其他字符串操作時,纔得到了這個錯誤很多次。

它爲什麼這樣做?我的腳本不能像運行命令一樣有效地運行所有操作嗎?

我很想工作bash腳本,確定......但我主要是要求與字符串操作工作時,爲什麼我得到一個Bad substitution錯誤。謝謝!

編輯:我發現我挺爲難的錯誤...從來沒有告訴過你我是如何執行這些腳本。我正在執行它們爲sh test.sh而不是bash test.sh。我假設sh會執行它們作爲用戶的默認shell,但我想我錯了(或者默認的shell不是bash)。

感謝您對輸入重定向的提示!當我得到一些有用的東西時,我會回覆我所擁有的。

回答

2

有許多引用不一致的:

while read line 
do 
    echo "${line:1}" 
    newname="${line%\/*}/${line#*-}" 
    echo "$newname" 
    # mv "$line" "$newname" 
done < <(find . -name '?-*.???') 

通常建議:使用輸入重定向而不是管道聯接到read

原因:while循環woulld在子shell由於執行管道

+0

謝謝,這已經在我的最新劇本中得到了照顧。我非常欣賞這些提示。 我遇到的錯誤是由執行腳本'sh test.sh'而不是'bash test.sh'。哎呀... – antiquekid3

+1

@ antiquekid3:啊,我想知道,但我因爲'#!'行而被解僱了。我應該提到它,因爲確實'sh test.sh'是一種強制選擇shell的方法!很高興你找到了! – sehe

2

嘗試在mv命令行中沒有反斜槓?

mv "$line" "$newname" 

反斜槓使得mv查找文件名中帶有文字雙引號的文件。

+0

謝謝,這似乎解決了它。因爲文件名中有空格,我想我需要文字雙引號,但我猜不是! – antiquekid3

相關問題