2016-06-23 3 views
0

나는 자주이 명령을 사용하여 원격 및 로컬을 동기화합니다.rsync에 별칭을 지정하는 방법은 무엇입니까?

rsync -xyz --foo=bar some_files [email protected]:remote_dir 

그래서 나는이 같은 별칭과 함께이 문제를 단순화 할 :

up_remote() { 
    local_files=${@:1:$((${#}-1))} # treat argument[1:last-1] as local files 
    remote_dir="${@[$#]}" # treat argument[last] as remote_dir 
    echo $local_files 
    echo $remote_dir 
    rsync -xyz --foo=bar "$local_files" [email protected]:"$remote_dir" 
} 

를하지만 세 개 이상의 인수를 전달하면 작동하지 않습니다 :

up_remote local1 local2 remote_dir 

I set -x로이 함수를 디버그합니다.이 함수는 rsync과 같이 생성됩니다.

rsync -xyz --foo=bar 'local1 local2' [email protected]:"$remote_dir" 

local1 local2 주위에 작은 따옴표 (')가 있습니다. 이 작은 따옴표를 제거하면 rsync가 올바르게 작동하지만이 작업을 수행하는 방법을 모르겠습니다.

어떤 조언을 환영합니다.

+0

for 루프를 사용 하시겠습니까? –

+0

물론 그것은 해결책이며 작동 할 것입니다. – MoreFreeze

답변

1

당신은 $local_files 주위에 따옴표를 제거해야합니다

up_remote() { 
    local_files=${@:1:$((${#}-1))} 
    remote_dir="${@:$#}" 
    rsync -xyz --foo=bar $local_files a.b.com:"$remote_dir" 
} 

참고 나는 또한 remote_dir이 포착되는 방식을 변경, 당신의 방법은 bash는 내 버전에서 작동시킬 수 없습니다.

+0

'local_files'에 두 개 이상의 인수를 전달하려고 했습니까? 위와 같이 :'up_remote file1 file2/tmp' 또는 'up_remote file */tmp' – MoreFreeze

+0

예, 두 호출 스타일 모두 정상적으로 작동합니다. bash의 어떤 버전을 사용하고 있으며, 내 기능으로 어떤 출력을 얻습니까? – IBam

+0

네 말이 맞아. 전에'zsh'에서 사용 했었습니다. 실수였습니다. 그리고 제 'bash'에서 작동합니다. 감사. – MoreFreeze

-1

대답별로 그러나 나는 펄을했고, 그것을 작동 :

#!/usr/bin/perl 

use strict; 
use warnings; 

my @args = @ARGV; 
my $files; 

my $destination=pop(@args); 

foreach(@args){ 
    $files.="'".$_."' "; 
} 

system("rsync -xyz --foo=bar $files user\@remote.com:$destination"); 

당신은 당신의 경로에이 스크립트를 복사하거나 별칭을 만들 수 있습니다.

+0

공백이 포함 된 파일 이름에는 실패합니다. String :: ShellQuote와 같은 것을 사용하지 않는 이유는 무엇입니까? –

+0

당신이 공백에 맞을 때 임시 해결책을 foreach에 추가하는 것입니다. (내 대답에 편집 됨) –

+0

파일 이름에 작은 따옴표가 있으면 깨집니다. 대상과 동일합니다. 내가 말했듯이, 당신을 위해 탈출을 할 수있는 모듈이 있습니다. –

관련 문제