rsync通配符在bash脚本中不起作用

时间:2017-07-16 21:35:17

标签: linux bash wildcard rsync raspberry-pi3

我尝试通过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脚本

有什么线索?

1 个答案:

答案 0 :(得分:1)

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

但是,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"