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

标签 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 脚本中不起作用

有什么线索吗?

最佳答案

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

关于linux - rsync 通配符在 bash 脚本中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45133499/

相关文章:

c - Linux (2.6.30) 中的 getrusage 是否损坏

linux - OpenCV VideoWriter 打不开

c++ - 如何从命令行 (unix) 打印二进制 double 组

sql - SQL LIKE查找-,/,_

Java 泛型返回参数化为更具体的两种类型的泛型?

sql-server - SQL Server查询以使用多个关键字搜索数据库

linux - 在 Slackware 14.2 中安装 TCP Wrappers

linux - 从字符串中删除不需要的双引号

bash - 在 sed 中使用变量

mysql - 如何在 mySQL 中使用 bash 别名