我通常使用scp来复制东西,但现在我正在尝试使用更强大的rsync命令.它通过仅复制已更改的文件来帮助我减少带宽使用.但是,rsync有很多复杂的参数,所以我想,嘿,我只是制作一个让我很容易的Bash脚本,并调用命令'rscp'.所以,我开始建造这样的东西.请注意,在下面的示例中,我的Web主机使用了除22之外的其他端口号,因此这就是使用$ 1的原因.
#!/bin/bash rsync -avzp --progress --rsh='ssh -p$1' $2 $3 $4 $5 $6 $7
所以,我希望它的用法如下:
rscp 3822 --exclude=tiny_mce /var/www/mysite/* root@webhost.com:~/www/mysite
你知道,这会让我更接近我对scp命令的使用.
但是,当我运行它时,我收到此错误:
building file list ... 4 files to consider ERROR: destination must be a directory when copying more than 1 file rsync error: errors selecting input/output files, dirs (code 3) at main.c(494) [receiver=2.6.9] rsync: connection unexpectedly closed (8 bytes received so far) [sender] rsync error: error in rsync protocol data stream (code 12) at io.c(454) [sender=2.6.9]
但是如果我回到常规rsync命令,它就可以了.
任何人都可以在我的Bash脚本中弄清楚我做错了什么吗?
/ var/www/mysite/*由shell扩展,因此传入的参数比在脚本中处理的要多得多.
此外,变量不能用单引号替换,因此您需要使用双引号.(参见bash 手册页)
试试这个:
#!/bin/bash PORT=$1 shift rsync -avzp --progress --rsh="ssh -p$PORT" "$@"
首先我们将端口从参数列表中取出(使用shift),然后我们使用"$ @"这是特殊的,它引用参数(在本例中为脚本),并转换为所有这些,但每个单独用双引号.(有关详细信息,请参阅bash 手册页).