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

rsync wildcard not working in bash script

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

中不起作用

知道为什么吗?

这不是 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 弄乱您的变量,这就是为什么引用如此重要并且值得称赞的原因。但是,在这种情况下,您实际上 do 想要路径名扩展,因此您应该小心地让变量不带引号:

# 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"