2015-11-19 2 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, гарантируя, что если интерпретируется той же оболочкой на удаленной стороне, содержимое будет оцениваться обратно к исходной строке.
  • <listofdirectories.txt - перенаправление из файла намного эффективнее, чем трубопроводы из процесса (например, cat), и позволяет избежать цикла в подоболочке, что создаст ошибки, как описано в 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. Поскольку переменные оболочки и переменные среды используют одно пространство имен, это означает, что ваши программные оболочки должны использовать имена всех нижних регистров для своих собственных переменных (в отличие от взаимодействия с или получения переменных оболочки, таких как PWD или PS1, или переменных, влияющих на систему такие как LANG, LC_ALL и т. д.).

1

Я думаю, что вам нужно процитировать его как для вас обстреливать и для удаленной системы

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

Я уверен, что на самом деле это не обязательно. 'rsync ./hello \ world.txt 'hostname: hello world.txt'' просто работал для меня. –

+0

Oooh. У источника есть разные правила. Хороший звонок; включив в свой собственный ответ некоторые хитрости (которые, по общему признанию, предполагают '/ bin/sh', предоставленные bash для имен файлов с особенно интересными непечатаемыми символами) ... –

Смежные вопросы