rsync到/来自名称为

时间:2015-11-19 18:38:22

标签: bash shell rsync

我需要输入不同的目录来使用rsync复制一些文件,但这些目录的名称带有空格(例如,“CODE ONE”)。所以当rsync运行时,我无法进入这些目录。目录名称位于配置文件中,而bash脚本中的名称位于变量中。

这是代码:

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

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

done

我试着把双引号,但结果是一样的。

有什么建议吗?

2 个答案:

答案 0 :(得分:4)

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,其余的放入名为{{1的变量(根据惯例,它被理解为一个不重要的/一次性变量)。有关详细信息,请参阅BashFAQ #1
  • _ - 使用read -r参数-r可以防止文件名中的反斜杠文字被剥离。
  • read - 将printf -v dirname_q '%q' "$dirname"内容的shell引用版本放入变量"$dirname",确保如果由远程端的相同shell解释,内容将评估回原始字符串。
  • dirname_q - 从文件重定向比从进程管道(例如<listofdirectories.txt)更有效,并避免在子shell中运行循环,这会产生错误,如{ {3}}。

最后,请注意使用小写变量名称。 BashFAQ #24由于shell变量和环境变量共享一个命名空间,这意味着你的shell程序应该为它们自己的变量使用全小写的名称(而不是与cat之类的shell变量进行交互或检索时或PWD或影响系统的变量,例如PS1LANG等。

答案 1 :(得分:1)

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

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