Bash функция псевдонима для копирования нескольких файлов с использованием SSH - PullRequest
0 голосов
/ 10 июля 2020

Я хочу скопировать несколько файлов с одного сервера на другой, и мне нужно сделать это с помощью scp с сервера на локальный, а затем локальный на сервер.

Я создал функцию псевдонима для того же, используя этот ответ

alias copy_file='function _copy(){ scp tarun@server1.com:/path_to_folder/"$1" ./ && scp "$1" tarun@server2.com:/path_to_folder/ ; };_copy'

Он работает для одного файла, подобного этому

copy_file temp1

Но когда я пытаюсь скопировать несколько файлов, как это объяснено здесь

copy_file {temp1,temp2}

Он копирует только первый файл

Однако, когда я запускаю команду псевдонима напрямую, он копирует оба файла. Как это:

scp tarun@server1.com:/path_to_folder/{temp1,temp2} ./ && scp {temp1,temp2} tarun@server2.com:/path_to_folder/

Пожалуйста, помогите.

Ответы [ 2 ]

1 голос
/ 10 июля 2020

Вы можете перебирать файлы с помощью $@, которое представляет количество входных аргументов:

alias copy_file='function _copy(){ for file in "$@"; do scp tarun@server1.com:/path_to_folder/"$file" ./ && scp "$file" tarun@server2.com:/path_to_folder/ ; done;};_copy'

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

Однако при этом будет запущено несколько команд scp вместо одной.

1 голос
/ 10 июля 2020

Передайте аргумент функции в двойных кавычках:

copy_file "{temp1,temp2}"

в противном случае bash будет анализировать их как вход отдельной функции, который $1 будет temp1, а $2 будет temp2

EDIT

вторая команда scp будет видеть "{temp1, temp2}" как имя файла. Для синтаксиса scp требуется отдельное имя файла, поэтому мы разделим эти имена файлов с помощью следующей функции:

scp tarun@server1.com:/path_to_folder/"$1" ./ && tmp="$1" && tmp=${tmp#"{"} && tmp=${tmp%"}"} && IFS=',' && array="$tmp" && scp $array tarun@server2.com:/path_to_folder/
...