2016-06-23 8 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は正しく動作しますが、これを行う方法はわかりません。

何かアドバイスは大歓迎です。

+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" 
} 

注意私も​​が選ばれている方法を変更し、bashの私のバージョンで動作するようにあなたの方法を得ることができませんでした。

+0

'local_files'に2つ以上の引数を渡そうとしましたか?このように: 'up_remote FILE1 FILE2/tmp' または ' up_remoteファイル*/tmp' – MoreFreeze

+0

はい、それらの呼び出しのスタイルの両方がうまく働きました。どのバージョンのbashを使用していますか、私の機能でどのような出力を得ていますか? – IBam

+0

あなたはそうです。私は前に 'zsh'で使っていましたが、それは私の間違いです。それは私の 'bash'で動作します。ありがとう。 – MoreFreeze

-1

答えそうでもないが、私はPerlでそれをやった、それが動作します:

#!/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

あなたのファイル名がsinglequotesを持っている場合今では壊れる –

+0

(私の答えに編集)空白のための右だ、回避策はforeachの中に単一引用符を追加することです。宛先でも同じです。私が言ったように、あなたのためにエスケープするモジュールがあります –

関連する問題