rsync to/from 名称中有空格的远程目录

rsync to/from a remote directory that has spaces in name

我需要进入不同的目录才能使用rsync复制一些文件,但这些目录的名称带有空格(例如"CODE ONE")。所以当rsync是运行的时候,我是进不了那些目录的。目录名称在配置文件中,在 bash 脚本中,名称在变量中。

这是代码:

cat listdirectories.txt | while read line
do
        DIRNAME=$(echo $line | awk -F\| '{print }')

rsync -rqut SERVER:/${DIRNAME}/${NAME_FILE} DIR_TARGET/

done

我试了下双引号,结果还是一样

有什么建议吗?

while IFS='|' read -r dirname _; do
    printf -v dirname_q '%q' "$dirname"
    rsync -rqut "SERVER:/${dirname_q}/${filename}" target_dir/
done <listofdirectories.txt

现在,让我们谈谈细节:

  • IFS='|' read -r dirname _ -- 配置 read| 个字符上拆分为多个变量,将第一列的内容放入 dirname,其余放入名为 _(按照惯例,这被理解为不重要/一次性变量)。有关详细信息,请参阅 BashFAQ #1
  • read -r -- 使用 read-r 参数可以防止文件名中的反斜杠文字被剥离。
  • printf -v dirname_q '%q' "$dirname" -- 将 "$dirname" 内容的 shell 引用版本放入变量 dirname_q,确保如果由相同的 [=45] 解释=] 在远程端,内容将评估回原始字符串。
  • <listofdirectories.txt -- 从文件重定向比从进程管道更有效(例如 cat),并且避免了 运行 子 [=45] 中的循环=],这会产生如 BashFAQ #24.
  • 中所述的错误

最后,注意小写变量名的使用。 IEEE Std 1003.1-2001 specifies that all-uppercase environment variables are reserved for system use, and variables containing lowercase characters are reserved for applications. 由于 shell 变量和环境变量共享一个命名空间,这意味着您的 shell 程序应该为它们自己的变量使用全小写名称(而不是在与 [=交互或检索 shell 变量,例如 PWDPS1,或影响系统的变量,例如 LANGLC_ALL 等)。

我认为您需要为远程系统 shell 都引用

rsync -rqut "SERVER:/'$DIRNAME'/'$NAME_FILE'" DIR_TARGET/
# local ....^...............................^
# remote ............^........^.^..........^