我通常使用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脚本中弄清楚我做错了吗?
答案 0 :(得分:7)
/ var / www / mysite / *由shell扩展,因此您传入的参数比您在脚本中处理的要多得多。
此外,变量不能用单引号替换,因此您需要使用双引号。 (见bash man page)
试试这个:
#!/bin/bash
PORT=$1
shift
rsync -avzp --progress --rsh="ssh -p$PORT" "$@"
首先我们将端口从参数列表中取出(使用shift),然后我们使用“$ @”这是特殊的,它引用参数(在本例中为脚本),并转换为所有这些参数,但每个单独用双引号括起来。 (有关详细信息,请参阅bash man page。)
答案 1 :(得分:0)
你不能在技术上把它变成一个函数吗?:
rscp() {
rsync -avzp --progress --rsh="ssh -p$PORT" "$@"
}
然后当你运行它时:rscp 3822