我需要输入不同的目录来使用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
我试着把双引号,但结果是一样的。
有什么建议吗?
答案 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
或影响系统的变量,例如PS1
,LANG
等。
答案 1 :(得分:1)
我认为您需要为远程系统的shell 和引用它
rsync -rqut "SERVER:/'$DIRNAME'/'$NAME_FILE'" DIR_TARGET/
# local ....^...............................^
# remote ............^........^.^..........^