2010-07-25 67 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