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

3

我尝试使用rsync将文件同步到我的树莓派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个回答

3
这不是一个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"

非常感谢,这解决了问题。没想到会有这么简单的解决方案。再次感谢,非常感激。 - wombat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接