【问题标题】:Error Trying To Make Easier rsync Command尝试简化 rsync 命令时出错
【发布时间】:2010-09-22 14:13:12
【问题描述】:

我通常使用 scp 来复制内容,但现在我正在尝试习惯更强大的 rsync 命令。它通过仅复制已更改的文件来帮助我使用更少的带宽。但是,rsync 有很多复杂的参数,所以我想,嘿,我就做一个简单的 Bash 脚本,调用命令 'rscp'。所以,我开始构建这样的东西。请注意,在下面的示例中,我的网络主机使用了除 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 脚本中做错了什么?

【问题讨论】:

    标签: bash rsync scp


    【解决方案1】:

    你不能从技术上把它变成一个函数吗?:

        rscp() {
    rsync -avzp --progress --rsh="ssh -p$PORT" "$@"
    }
    

    然后当你运行它时:rscp 3822

    【讨论】:

      【解决方案2】:

      /var/www/mysite/* 由 shell 扩展,因此传入的参数比在脚本中处理的参数多得多。

      变量也不能用单引号代替,所以你需要使用双引号。 (见 bash man page)

      试试这个:

      #!/bin/bash
      PORT=$1
      shift
      rsync -avzp --progress --rsh="ssh -p$PORT" "$@"
      

      首先我们从参数列表中取出端口(使用移位),然后我们使用特殊的“$@”,它引用参数(在本例中是脚本),并转换为所有参数,但每个都分别用双引号引起来。 (有关更多详细信息,请参阅 bash man page)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-11-05
        • 2021-01-08
        • 2020-12-18
        • 2021-08-29
        • 1970-01-01
        • 2012-09-27
        相关资源
        最近更新 更多