2010-07-25 68 views
2

我正在編寫以下腳本以將* .nzb文件複製到文件夾以將它們排隊等待下載。用於在目錄之間複製文件的bash腳本

我寫了下面的腳本

#!/bin/bash 

#This script copies NZB files from Downloads folder to HellaNZB queue folder. 

${DOWN}="/home/user/Downloads/" 
${QUEUE}="/home/user/.hellanzb/nzb/daemon.queue/" 


for a in $(find ${DOWN} -name *.nzb) 
do 
cp ${a} ${QUEUE} 
rm *.nzb 
done 

它給了我下面的錯誤說:

HellaNZB.sh: line 5: =/home/user/Downloads/: No such file or directory 
HellaNZB.sh: line 6: =/home/user/.hellanzb/nzb/daemon.queue/: No such file or directory 

的是,這些目錄exsist,我有權訪問它們。

任何幫助將是很好的。

請謝謝。

+1

你可以在find中查找一下'-exec'來簡化它:'find $ DOWN -name * .nzb -exec mv {} $ QUEUE \;'。 – SiggyF 2010-07-25 23:00:41

回答

7

作業左側的變量名應該是裸露的。

foo="something" 
echo "$foo" 

這裏有一些更多的改進你的腳本:

#!/bin/bash 

#This script copies NZB files from Downloads folder to HellaNZB queue folder. 

down="/home/myusuf3/Downloads/" 
queue="/home/myusuf3/.hellanzb/nzb/daemon.queue/" 

find "${down}" -name "*.nzb" | while read -r file 
do 
    mv "${file}" "${queue}" 
done 

使用while代替for和報價包含文件名變量防止含有被解釋爲一個以上的文件名空格的文件名。刪除rm可避免重複出錯並且無法複製除第一個文件以外的任何文件。需要引用-name的文件glob。習慣性地使用小寫變量名減少了與shell變量名稱衝突的機會。

如果您的所有文件都在一個目錄下(而不是在多個子目錄)你的整個腳本可以被歸納爲以下,順便說一句:

mv /home/myusuf3/Downloads/*.nzb /home/myusuf3/.hellanzb/nzb/daemon.queue/ 

如果你有多個子目錄中的文件:

find /home/myusuf3/Downloads/ -name "*.nzb" -exec mv {} /home/myusuf3/.hellanzb/nzb/daemon.queue/ + 

正如您所看到的,不需要循環。

+0

哈哈,這真是愚蠢的我謝謝!我無法確定我生活中的問題是什麼。 – myusuf3 2010-07-25 23:00:48

+0

@garbagecollector:請參閱我的編輯其他提示。 – 2010-07-25 23:07:10

+0

感謝您的幫助! :) – myusuf3 2010-07-25 23:15:11

1

正確的語法是:

DOWN="/home/myusuf3/Downloads/" 
QUEUE="/home/myusuf3/.hellanzb/nzb/daemon.queue/" 
1
for a in $(find ${DOWN} -name *.nzb) 
    # escape the * or it will be expanded in the current directory 
    # let's just hope no file has blanks in its name 
do 
    cp ${a} ${QUEUE} # ok, although I'd normally add a -p 
    rm *.nzb   # again, this is expanded in the current directory 
        # when you fix that, it will remove ${a}s before they are copied 

done 

你爲什麼不只是使用RM $(一}

爲什麼使用CP的組合和rm反正不是MV?

你知道所有文件都將在同一個目錄中結束,並從不同的目錄同名的文件將互相覆蓋?

如果cp失敗怎麼辦?你會失去你的文件。

+0

都非常真實。感謝您的反饋! – myusuf3 2010-07-25 23:13:12