имя каталога с пробелом и bash

Я хотел бы исключить из резервной копии каталоги «temp» и «Ubuntu One /».

Chris

Редактировать / PS:

excludes=( ".*" temp/ "Ubuntu One/" )' 'RSYNCCONF="${excludes[@]/#/--exclude=}"

и

$RSYNC -e "$S" -avR $FROMSSH:$SOURCE ${RSYNCCONF[@]} $TARGET$TODAY $INC >> $LOG 2>&1

не работает. Я был бы очень признателен за любые советы.

Это сценарий: http://wiki.ubuntuusers.de/_attachment?target=Skripte%2FBackup_mit_RSYNC%2Fbackup.sh

6
задан 15 June 2011 в 04:00

24 ответа

Вот один из способов сделать это.

excludes=( ".*" temp/ "Ubuntu One/" ) rsync --delete "${excludes[@]/#/--exclude=}"

Обратите внимание, что в приведенном выше примере используется синтаксис bash, поэтому он не будет работать с sh. Кроме того, цитаты являются жизненно важными, не опускайте их.

См. Http://mywiki.wooledge.org/WordSplitting для объяснения причин неправильного ввода нескольких аргументов в строковую переменную.

РЕДАКТИРОВАТЬ: Из пастебинов в ваших комментариях это похоже на то, что вы хотите.

#!/bin/bash source=/home/chris/ backupdir=/media/alteplatte/backups backupname=$(date +%Y-%m-%d)-cd excludes=( ".*" temp/ "Ubuntu One/" ) linkdest=$backupdir/link if [[ -d $backupdir ]]; then rsync -av ${linkdest:+"--link-dest=$linkdest"} --delete \ "${excludes[@]/#/--exclude=}" "$source" "$backupdir/$backupname" else echo "$0: $backupdir: Not a directory, make sure the filesystem is mounted" >&2 exit 1 fi
1
ответ дан 25 July 2018 в 21:44

Если вы создаете параметры в строке, вы столкнетесь с проблемами при попытке использовать ее (rsync "$RSYNCCONF"). Лучше использовать массив - при разыменовании массива каждый элемент будет правильно обработан оболочкой:

RSYNCCONF=( --delete '--exclude=.*' --exclude=temp/ '--exclude="Ubuntu One/"' ) rsync "${RSYNCCONF[@]}"
7
ответ дан 25 July 2018 в 21:44
  • 1
    Ну, я скопировал весь скрипт из wiki.ubuntuusers.de/… Я не знаю, как обрабатывать все остальные параметры, поэтому в следующий раз я попытаюсь ответить Раджишу. Не будет ли это работать? – chris 13 June 2011 в 22:12
  • 2
    Вам нужно потерять внешние кавычки на последнем --exclude там. – geirha 14 June 2011 в 01:26
  • 3
    Спасибо за все ответы. Когда я использую массив, как в ответе Гленна или Гейрхи, что я пишу, например, в строке 53? $RSYNC -e "$S" -avR $FROMSSH:$SOURCE "${RSYNCCONF[@]}" $TARGET$TODAY $INC >> $LOG 2>&1 Просто замените $RSYNCCONF на массив? – chris 14 June 2011 в 04:15
  • 4
    'исключает = (". *" temp / "Ubuntu One /")' 'RSYNCCONF = "$ {исключает [@] / # / - exclude =}" и "$ RSYNC -e" $ S " -avR $ FROMSSH: $ SOURCE $ {RSYNCCONF [@]} $ TARGET $ TODAY $ INC & gt; & gt; & gt; $ LOG 2 & amp; 1 'не работает. Я бы очень признателен за любые советы. – chris 15 June 2011 в 03:57

Поместите его в одинарные кавычки:

  RSYNCCONF = "- delete --exclude =. * --exclude = temp / --exclude = 'Ubuntu One /'"  

или поставить обратную косую черту перед пробелом:

  RSYNCCONF = "- delete --exclude =. * --exclude = temp / --exclude = Ubuntu \  \ One / " 
1
ответ дан 25 July 2018 в 21:44

Если вы создаете параметры в строке, вы столкнетесь с проблемами при попытке использовать ее ( rsync "$ RSYNCCONF" ). Лучше использовать массив - при разыменовании массива каждый элемент будет правильно обработан оболочкой:

  RSYNCCONF = (--delete '--exclude =. *' --Exclude  = temp / '--exclude = "Ubuntu One /"') rsync "$ {RSYNCCONF [@]}"  
7
ответ дан 31 July 2018 в 11:19

Вот один из способов сделать это.

  исключает = (". *" temp / "Ubuntu One /") rsync --delete "$ {исключает [@] / # / -  -exclude =} " 

Обратите внимание, что в приведенном выше примере используется синтаксис bash, поэтому он не будет работать с sh. Кроме того, цитаты являются жизненно важными, не опускайте их.

См. [D0] http://mywiki.wooledge.org/WordSplitting для объяснения того, почему положить более одного аргумента в Строка переменной неверна.

РЕДАКТИРОВАТЬ: Из пастебина в ваших комментариях это похоже на то, что вы хотите.

  #! / bin / bash source = / home /  chris / backupdir = / media / alteplatte / backups backupname = $ (date +% Y-% m-% d) -cd исключает = (". *" temp / "Ubuntu One /") linkdest = $ backupdir / link, если [  [-d $ backupdir]];  затем rsync -av $ {linkdest: + "- link-dest = $ linkdest"} --delete \ "$ {исключает [@] / # / - exclude =}" "$ source" "$ backupdir / $ backupname  «else echo» $ 0: $ backupdir: не каталог, убедитесь, что файловая система смонтирована «& gt; & amp; 2 exit 1 fi  
1
ответ дан 31 July 2018 в 11:19

Поместите его в одинарные кавычки:

RSYNCCONF="--delete --exclude=.* --exclude=temp/ --exclude='Ubuntu One/' "

или поместите обратную косую черту перед пробелом:

RSYNCCONF="--delete --exclude=.* --exclude=temp/ --exclude=Ubuntu\\ One/ "
1
ответ дан 31 July 2018 в 11:19

Если вы создаете параметры в строке, вы столкнетесь с проблемами при попытке использовать ее ( rsync "$ RSYNCCONF" ). Лучше использовать массив - при разыменовании массива каждый элемент будет правильно обработан оболочкой:

  RSYNCCONF = (--delete '--exclude =. *' --Exclude  = temp / '--exclude = "Ubuntu One /"') rsync "$ {RSYNCCONF [@]}"  
7
ответ дан 2 August 2018 в 03:19

Поместите его в одинарные кавычки:

  RSYNCCONF = "- delete --exclude =. * --exclude = temp / --exclude = 'Ubuntu One /'"  

или поставить обратную косую черту перед пробелом:

  RSYNCCONF = "- delete --exclude =. * --exclude = temp / --exclude = Ubuntu \  \ One / " 
1
ответ дан 2 August 2018 в 03:19

Вот один из способов сделать это.

  исключает = (". *" temp / "Ubuntu One /") rsync --delete "$ {исключает [@] / # / -  -exclude =} " 

Обратите внимание, что в приведенном выше примере используется синтаксис bash, поэтому он не будет работать с sh. Кроме того, цитаты являются жизненно важными, не опускайте их.

См. [D0] http://mywiki.wooledge.org/WordSplitting для объяснения того, почему положить более одного аргумента в Строка переменной неверна.

РЕДАКТИРОВАТЬ: Из пастебина в ваших комментариях это похоже на то, что вы хотите.

  #! / bin / bash source = / home /  chris / backupdir = / media / alteplatte / backups backupname = $ (date +% Y-% m-% d) -cd исключает = (". *" temp / "Ubuntu One /") linkdest = $ backupdir / link, если [  [-d $ backupdir]];  затем rsync -av $ {linkdest: + "- link-dest = $ linkdest"} --delete \ "$ {исключает [@] / # / - exclude =}" "$ source" "$ backupdir / $ backupname  «else echo» $ 0: $ backupdir: не каталог, убедитесь, что файловая система смонтирована «& gt; & amp; 2 exit 1 fi  
1
ответ дан 2 August 2018 в 03:19

Вот один из способов сделать это.

  исключает = (". *" temp / "Ubuntu One /") rsync --delete "$ {исключает [@] / # / -  -exclude =} " 

Обратите внимание, что в приведенном выше примере используется синтаксис bash, поэтому он не будет работать с sh. Кроме того, цитаты являются жизненно важными, не опускайте их.

См. [D0] http://mywiki.wooledge.org/WordSplitting для объяснения того, почему положить более одного аргумента в Строка переменной неверна.

РЕДАКТИРОВАТЬ: Из пастебина в ваших комментариях это похоже на то, что вы хотите.

  #! / bin / bash source = / home /  chris / backupdir = / media / alteplatte / backups backupname = $ (date +% Y-% m-% d) -cd исключает = (". *" temp / "Ubuntu One /") linkdest = $ backupdir / link, если [  [-d $ backupdir]];  затем rsync -av $ {linkdest: + "- link-dest = $ linkdest"} --delete \ "$ {исключает [@] / # / - exclude =}" "$ source" "$ backupdir / $ backupname  «else echo» $ 0: $ backupdir: не каталог, убедитесь, что файловая система смонтирована «& gt; & amp; 2 exit 1 fi  
1
ответ дан 4 August 2018 в 19:17

Если вы создаете параметры в строке, вы столкнетесь с проблемами при попытке использовать ее (rsync "$RSYNCCONF"). Лучше использовать массив - при разыменовании массива каждый элемент будет правильно обработан оболочкой:

RSYNCCONF=( --delete '--exclude=.*' --exclude=temp/ '--exclude="Ubuntu One/"' ) rsync "${RSYNCCONF[@]}"
7
ответ дан 4 August 2018 в 19:17
  • 1
    Ну, я скопировал весь скрипт из wiki.ubuntuusers.de/… Я не знаю, как обрабатывать все остальные параметры, поэтому в следующий раз я попытаюсь ответить Раджишу. Не будет ли это работать? – chris 13 June 2011 в 22:12
  • 2
    Вам нужно потерять внешние кавычки на последнем --exclude там. – geirha 14 June 2011 в 01:26
  • 3
    @chris Я боюсь, что сценарий довольно плохо написан, так что это не хороший скрипт для использования в качестве шаблона. – geirha 14 June 2011 в 01:36
  • 4
    'исключает = (". *" temp / "Ubuntu One /")' 'RSYNCCONF = "$ {исключает [@] / # / - exclude =}" и "$ RSYNC -e" $ S " -avR $ FROMSSH: $ SOURCE $ {RSYNCCONF [@]} $ TARGET $ TODAY $ INC & gt; & gt; & gt; $ LOG 2 & amp; 1 'не работает. Я бы очень признателен за любые советы. – chris 15 June 2011 в 03:57

Поместите его в одинарные кавычки:

RSYNCCONF="--delete --exclude=.* --exclude=temp/ --exclude='Ubuntu One/' "

или поместите обратную косую черту перед пробелом:

RSYNCCONF="--delete --exclude=.* --exclude=temp/ --exclude=Ubuntu\\ One/ "
1
ответ дан 4 August 2018 в 19:17
  • 1
    Вы не можете поставить синтаксические кавычки внутри кавычек. Массив является единственным разумным способом. – geirha 14 June 2011 в 01:23

Если вы создаете параметры в строке, вы столкнетесь с проблемами при попытке использовать ее (rsync "$RSYNCCONF"). Лучше использовать массив - при разыменовании массива каждый элемент будет правильно обработан оболочкой:

RSYNCCONF=( --delete '--exclude=.*' --exclude=temp/ '--exclude="Ubuntu One/"' ) rsync "${RSYNCCONF[@]}"
7
ответ дан 6 August 2018 в 03:30
  • 1
    @chris Я боюсь, что сценарий довольно плохо написан, так что это не хороший скрипт для использования в качестве шаблона. – geirha 14 June 2011 в 01:36
  • 2
    Спасибо за все ответы. Когда я использую массив, как в ответе Гленна или Гейрхи, что я пишу, например, в строке 53? $RSYNC -e "$S" -avR $FROMSSH:$SOURCE "${RSYNCCONF[@]}" $TARGET$TODAY $INC >> $LOG 2>&1 Просто замените $RSYNCCONF на массив? – chris 14 June 2011 в 04:15

Поместите его в одинарные кавычки:

RSYNCCONF="--delete --exclude=.* --exclude=temp/ --exclude='Ubuntu One/' "

или поместите обратную косую черту перед пробелом:

RSYNCCONF="--delete --exclude=.* --exclude=temp/ --exclude=Ubuntu\\ One/ "
1
ответ дан 6 August 2018 в 03:30
  • 1
    Вы не можете поставить синтаксические кавычки внутри кавычек. Массив является единственным разумным способом. – geirha 14 June 2011 в 01:23

Вот один из способов сделать это.

  исключает = (". *" temp / "Ubuntu One /") rsync --delete "$ {исключает [@] / # / -  -exclude =} " 

Обратите внимание, что в приведенном выше примере используется синтаксис bash, поэтому он не будет работать с sh. Кроме того, цитаты являются жизненно важными, не опускайте их.

См. [D0] http://mywiki.wooledge.org/WordSplitting для объяснения того, почему положить более одного аргумента в Строка переменной неверна.

РЕДАКТИРОВАТЬ: Из пастебина в ваших комментариях это похоже на то, что вы хотите.

  #! / bin / bash source = / home /  chris / backupdir = / media / alteplatte / backups backupname = $ (date +% Y-% m-% d) -cd исключает = (". *" temp / "Ubuntu One /") linkdest = $ backupdir / link, если [  [-d $ backupdir]];  затем rsync -av $ {linkdest: + "- link-dest = $ linkdest"} --delete \ "$ {исключает [@] / # / - exclude =}" "$ source" "$ backupdir / $ backupname  «else echo» $ 0: $ backupdir: не каталог, убедитесь, что файловая система смонтирована «& gt; & amp; 2 exit 1 fi  
1
ответ дан 6 August 2018 в 03:30

Если вы создаете параметры в строке, вы столкнетесь с проблемами при попытке использовать ее ( rsync "$ RSYNCCONF" ). Лучше использовать массив - при разыменовании массива каждый элемент будет правильно обработан оболочкой:

  RSYNCCONF = (--delete '--exclude =. *' --Exclude  = temp / '--exclude = "Ubuntu One /"') rsync "$ {RSYNCCONF [@]}"  
7
ответ дан 7 August 2018 в 21:17

Поместите его в одинарные кавычки:

  RSYNCCONF = "- delete --exclude =. * --exclude = temp / --exclude = 'Ubuntu One /'"  

или поставить обратную косую черту перед пробелом:

  RSYNCCONF = "- delete --exclude =. * --exclude = temp / --exclude = Ubuntu \  \ One / " 
1
ответ дан 7 August 2018 в 21:17

Вот один из способов сделать это.

  исключает = (". *" temp / "Ubuntu One /") rsync --delete "$ {исключает [@] / # / -  -exclude =} " 

Обратите внимание, что в приведенном выше примере используется синтаксис bash, поэтому он не будет работать с sh. Кроме того, цитаты являются жизненно важными, не опускайте их.

См. [D0] http://mywiki.wooledge.org/WordSplitting для объяснения того, почему положить более одного аргумента в Строка переменной неверна.

РЕДАКТИРОВАТЬ: Из пастебина в ваших комментариях это похоже на то, что вы хотите.

  #! / bin / bash source = / home /  chris / backupdir = / media / alteplatte / backups backupname = $ (date +% Y-% m-% d) -cd исключает = (". *" temp / "Ubuntu One /") linkdest = $ backupdir / link, если [  [-d $ backupdir]];  затем rsync -av $ {linkdest: + "- link-dest = $ linkdest"} --delete \ "$ {исключает [@] / # / - exclude =}" "$ source" "$ backupdir / $ backupname  «else echo» $ 0: $ backupdir: не каталог, убедитесь, что файловая система смонтирована «& gt; & amp; 2 exit 1 fi  
1
ответ дан 7 August 2018 в 21:17

Поместите его в одинарные кавычки:

  RSYNCCONF = "- delete --exclude =. * --exclude = temp / --exclude = 'Ubuntu One /'"  

или поставить обратную косую черту перед пробелом:

  RSYNCCONF = "- delete --exclude =. * --exclude = temp / --exclude = Ubuntu \  \ One / " 
1
ответ дан 10 August 2018 в 09:36

Вот один из способов сделать это.

  исключает = (". *" temp / "Ubuntu One /") rsync --delete "$ {исключает [@] / # / -  -exclude =} " 

Обратите внимание, что в приведенном выше примере используется синтаксис bash, поэтому он не будет работать с sh. Кроме того, цитаты являются жизненно важными, не опускайте их.

См. [D0] http://mywiki.wooledge.org/WordSplitting для объяснения того, почему положить более одного аргумента в Строка переменной неверна.

РЕДАКТИРОВАТЬ: Из пастебина в ваших комментариях это похоже на то, что вы хотите.

  #! / bin / bash source = / home /  chris / backupdir = / media / alteplatte / backups backupname = $ (date +% Y-% m-% d) -cd исключает = (". *" temp / "Ubuntu One /") linkdest = $ backupdir / link, если [  [-d $ backupdir]];  затем rsync -av $ {linkdest: + "- link-dest = $ linkdest"} --delete \ "$ {исключает [@] / # / - exclude =}" "$ source" "$ backupdir / $ backupname  «else echo» $ 0: $ backupdir: не каталог, убедитесь, что файловая система смонтирована «& gt; & amp; 2 exit 1 fi  
1
ответ дан 10 August 2018 в 09:36

Если вы создаете параметры в строке, вы столкнетесь с проблемами при попытке использовать ее ( rsync "$ RSYNCCONF" ). Лучше использовать массив - при разыменовании массива каждый элемент будет правильно обработан оболочкой:

  RSYNCCONF = (--delete '--exclude =. *' --Exclude  = temp / '--exclude = "Ubuntu One /"') rsync "$ {RSYNCCONF [@]}"  
7
ответ дан 10 August 2018 в 09:36

Поместите его в одинарные кавычки:

  RSYNCCONF = "- delete --exclude =. * --exclude = temp / --exclude = 'Ubuntu One /'"  

или поставить обратную косую черту перед пробелом:

  RSYNCCONF = "- delete --exclude =. * --exclude = temp / --exclude = Ubuntu \  \ One / " 
1
ответ дан 13 August 2018 в 15:46
  • 1
    Вы не можете поставить синтаксические кавычки внутри кавычек. Массив является единственным разумным способом. – geirha 14 June 2011 в 01:23

Если вы создаете параметры в строке, вы столкнетесь с проблемами при попытке использовать ее ( rsync "$ RSYNCCONF" ). Лучше использовать массив - при разыменовании массива каждый элемент будет правильно обработан оболочкой:

  RSYNCCONF = (--delete '--exclude =. *' --Exclude  = temp / '--exclude = "Ubuntu One /"') rsync "$ {RSYNCCONF [@]}"  
7
ответ дан 13 August 2018 в 15:46
  • 1
    Ну, я скопировал весь скрипт из wiki.ubuntuusers.de/… Я не знаю, как обрабатывать все остальные параметры, поэтому в следующий раз я попытаюсь ответить Раджишу. Не будет ли это работать? – chris 13 June 2011 в 22:12
  • 2
    Вам нужно потерять внешние кавычки на последнем --exclude там. – geirha 14 June 2011 в 01:26
  • 3
    @chris Я боюсь, что сценарий довольно плохо написан, так что это не хороший скрипт для использования в качестве шаблона. – geirha 14 June 2011 в 01:36
  • 4
    Спасибо за все ответы. Когда я использую массив, как в ответе Гленна или Гейрхи, что я пишу, например, в строке 53? $ RSYNC -e "$ S" -avR $ FROMSSH: $ SOURCE & quot; $ {RSYNCCONF [@]} & quot; $ TARGET $ TODAY $ INC & gt; & gt; & gt; $ LOG 2 & amp; 1 Просто замените $ RSYNCCONF на массив? – chris 14 June 2011 в 04:15
  • 5
    'исключает = (". *" temp / "Ubuntu One /")' 'RSYNCCONF = "$ {исключает [@] / # / - exclude =}" и "$ RSYNC -e" $ S " -avR $ FROMSSH: $ SOURCE $ {RSYNCCONF [@]} $ TARGET $ TODAY $ INC & gt; & gt; & gt; $ LOG 2 & amp; 1 'не работает. Я бы очень признателен за любые советы. – chris 15 June 2011 в 03:57

Вот один из способов сделать это.

  исключает = (". *" temp / "Ubuntu One /") rsync --delete "$ {исключает [@] / # / -  -exclude =} " 

Обратите внимание, что в приведенном выше примере используется синтаксис bash, поэтому он не будет работать с sh. Кроме того, цитаты являются жизненно важными, не опускайте их.

См. [D0] http://mywiki.wooledge.org/WordSplitting для объяснения того, почему положить более одного аргумента в Строка переменной неверна.

РЕДАКТИРОВАТЬ: Из пастебина в ваших комментариях это похоже на то, что вы хотите.

  #! / bin / bash source = / home /  chris / backupdir = / media / alteplatte / backups backupname = $ (date +% Y-% m-% d) -cd исключает = (". *" temp / "Ubuntu One /") linkdest = $ backupdir / link, если [  [-d $ backupdir]];  затем rsync -av $ {linkdest: + "- link-dest = $ linkdest"} --delete \ "$ {исключает [@] / # / - exclude =}" "$ source" "$ backupdir / $ backupname  «else echo» $ 0: $ backupdir: не каталог, убедитесь, что файловая система смонтирована «& gt; & amp; 2 exit 1 fi  
1
ответ дан 13 August 2018 в 15:46
  • 1
    Дорогой господин, большое спасибо. Это именно то, что я искал. Я ничего не знаю о bash-scripting. Теперь у меня есть надежная резервная копия! Еще раз спасибо. – chris 16 June 2011 в 10:37

Другие вопросы по тегам:

Похожие вопросы: