【问题标题】:rsync wildcard not working in bash scriptrsync通配符在bash脚本中不起作用
【发布时间】:2017-07-16 21:35:16
【问题描述】:

我尝试通过rsync 将文件同步到我的raspberry pi 3

rsync -v -P -r --size-only --remove-source-files /home/user*.mp3 osmc@192.168.0.110:/media/hdd/

此命令运行良好,仅复制 mp3 文件。

由于文件并不都在同一个地方,而且我不想一直键入命令,我做了一个bash 脚本,这样我就可以更改源和目​​标的路径。

echo "ENTER PATH" 
read -i "/home/user/*.mp3" -e path

echo "ENTER DESTINATION!"
read -i "osmc@192.168.0.110:/media/hdd/" -e dest

rsync -v -P -r --size-only --remove-source-files "$path" "$dest"

但这给了我以下错误信息

rsync: link_stat "/home/user/*.mp3" failed: No such file or directory (2)

如果我执行"/home/user/",则脚本正在运行,但不仅会复制所有文件mp3。所以我想通配符在这个bash 脚本中不起作用

有什么线索吗?

【问题讨论】:

    标签: linux bash wildcard rsync raspberry-pi3


    【解决方案1】:

    这不是rsync 通配符,而是bash 通配符,又名glob。 Bash 会在调用 rsync 之前将其替换为文件列表。

    但是,bash 不会对引用的变量进行分词和通配:

    var="/etc/*tab"
    echo "Quoted:" "$var"
    echo "Unquoted:" $var
    

    结果:

    Quoted: /etc/*tab
    Unquoted: /etc/crontab /etc/fstab /etc/inittab /etc/mtab
    

    您通常不希望 bash 弄乱您的变量,这就是为什么引用如此重要和这样做的荣誉。但是,在这种情况下,您实际上 确实 想要扩展路径名,因此您应该小心地将变量不加引号:

    # Prevent word splitting, so that '/path with spaces/*.mp3' still works
    IFS="" 
    # No quoting on $path, to allow glob expansion:
    rsync -v -P -r --size-only --remove-source-files $path "$dest"
    

    【讨论】:

    • 谢谢,这解决了问题。不知道这可能是一个如此简单的解决方案。再次感谢您,非常感谢。
    猜你喜欢
    • 2012-08-13
    • 1970-01-01
    • 2019-08-28
    • 1970-01-01
    • 2016-02-05
    • 2012-10-16
    • 2011-03-02
    • 2011-09-04
    相关资源
    最近更新 更多