2016-06-23 2 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 

Когда я отлаживать эту функцию с помощью set -x. Я обнаружил, что функция будет генерировать rsync следующим образом:

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

Обратите внимание на одинарные кавычки (') около local1 local2. Если я удалю эти одинарные кавычки, то rsync будет работать правильно, но я не знаю, как это сделать.

Любые советы приветствуются.

+0

Используйте петлю для петли? –

+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 определена, не может получить свой путь, чтобы работать в моей версии Баш.

+0

Вы пытались передать два или более аргумента в 'local_files'? Например: 'up_remote file1 file2/tmp' или ' up_remote file */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

Вы правы для пробелов, обходным путем является добавление одинарных кавычек в foreach (Отредактировано в моем ответе) –

+0

Теперь он ломается, если у вашего имени файла есть одиночные кавычки. То же самое для назначения. Как я уже сказал, есть модули для ускорения для вас –