最近我一直在組織我的音樂庫,我試圖讓所有「看起來」都一樣。我的所有歌曲應該看起來像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)。
感謝您對輸入重定向的提示!當我得到一些有用的東西時,我會回覆我所擁有的。
謝謝,這已經在我的最新劇本中得到了照顧。我非常欣賞這些提示。 我遇到的錯誤是由執行腳本'sh test.sh'而不是'bash test.sh'。哎呀... – antiquekid3
@ antiquekid3:啊,我想知道,但我因爲'#!'行而被解僱了。我應該提到它,因爲確實'sh test.sh'是一種強制選擇shell的方法!很高興你找到了! – sehe