2015-11-19 82 views
-1

我需要輸入不同的目錄才能使用rsync複製某些文件,但這些目錄的名稱都帶有空格(例如「CODE ONE」)。所以當rsync正在運行時,我無法進入這些目錄。目錄的名稱是在配置文件中,並且在bash腳本中名稱是在一個變量中。rsync與空間名稱相同的遠程目錄

這是代碼:

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

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

done 

我嘗試把雙引號,但結果是一樣的。

有什麼建議嗎?

+2

你放到哪兒了雙引號引用它兩者兼而有之? – Eduardo

+0

順便說一句,如果您明確指定了輸入格式(即管道分隔的內容),而不是要求讀者從您的代碼中解釋,那將會很有幫助。 –

+0

另請注意,在UNIX上的文件名中允許使用管道字符(就像換行符一樣),所以有很多可能的文件/目錄名稱,這裏使用的文件格式不可能處理。 –

回答

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,其餘到名爲_變量(按照慣例,這被認爲是不重要的/一次性變量)。有關詳細信息,請參見BashFAQ #1
  • read -r - 使用-r參數read可防止文件名中的反斜槓文字被剝離。
  • printf -v dirname_q '%q' "$dirname" - 將"$dirname"的內容的外殼引用版本放入變量dirname_q,確保如果由遠程端的同一個shell解釋,則內容將返回到原始字符串。
  • <listofdirectories.txt - 從文件重定向比從流程管道(例如cat)更有效,並避免在子shell中運行循環,這會產生如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變量交互或檢索shell變量(如PWDPS1或系統影響變量如LANG,LC_ALL等)。

1

我認爲你需要爲你殼遠程系統

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

我很確定這不是必需的。 'rsync ./hello \ world.txt'主機名:hello world.txt''剛剛爲我工作。 –

+0

Oooh。來源有不同的規則。好決定;在我自己的答案中加入了一些調整(無可否認,它假定bash提供的/ bin/sh用於具有特別有趣的不可打印字符的文件名)... –

相關問題