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