Запись функции bash, которая работает в списке имен файлов

Я хочу определить функцию cpfromserver в bash, чтобы при запуске

 $ cpfromserver xxx yyy zzz 

результат такой же, как если бы я набрал

 $ scp user@remote.server:"/some/location/xxx/xxx.txt /some/location/xxx/xxx.pdf /some/location/yyy/yyy.txt /some/location/yyy/yyy.pdf /some/location/zzz/zzz.txt /some/location/zzz/zzz.pdf" /somewhere/else/ 

где он работает для любого количества аргументов.

(То есть, функция должна копировать filename.txt и filename.pdf из каталога /some/location/filename/ на remote.server в локальный каталог /somewhere/else/ для каждого filename я указываю в качестве аргумента функции И сделайте все это в одном подключении ssh .)

В настоящее время я написал функцию, которая работает для одного аргумента, и я просто перебираю ее, но это устанавливает отдельные ssh соединения для каждого аргумента, что нежелательно.

Моя трудность заключается в том, что я знаю только, как использовать аргументы функции по своей позиции ( $1 , $2 и т. Д.), А не как манипулировать всем списком.

[Обратите внимание, что я пишу эту функцию как инструмент удобства только для моего собственного использования, и поэтому я бы поставил приоритет в своей легкости понимания при обработке патологических случаев, таких как имена файлов с кавычками или строк в них и еще много чего. Я знаю, что имена файлов, с которыми я буду использовать это, – это хорошо.]

3 Solutions collect form web for “Запись функции bash, которая работает в списке имен файлов”

Попробуйте так:

 cpfromserver () { files='' for x in "$@" do files="$files /some/location/$x/$x.txt /some/location/$x/$x.pdf" done scp user@remote.server:"$files" /somewhere/else/ } 

Важное предостережение от комментариев : «Для потомков стоит отметить, что это решение определенно не будет работать для сложных имен файлов. Если имя файла содержит пробел или новую строку или кавычки, этот подход определенно потерпит неудачу».

Вот простой пример:

 #!/bin/bash files_to_copy='' destination_directory='' while (("$#")) ; do if [[ "$@" = "$1" ]] ; then # last argument destination_directory="$1" else # argument files_to_copy="$files_to_copy $1" fi shift done scp user@remote.server:"$files_to_copy" $destination_directory; 

Если вы запустите ./example.sh foo.pdf foo.txt foo.jpg backup/ вы должны получить:

 # this will be executed scp user@remote.server:" foo.pdf foo.txt foo.jpg" backup/ 

Основная идея состоит в том, чтобы подготовить строку со списком файлов для работы (даже через цикл), чем передать строку в команду:

 sloc='/some/location' unset flist for i in "$@" do flist[${#flist[*]}]="$sloc/$i/$i".pdf flist[${#flist[*]}]="$sloc/$i/$i".txt done scp user@remote.server:"${flist[@]}" /somewhere/else/ - sloc='/some/location' unset flist for i in "$@" do flist[${#flist[*]}]="$sloc/$i/$i".pdf flist[${#flist[*]}]="$sloc/$i/$i".txt done scp user@remote.server:"${flist[@]}" /somewhere/else/ - sloc='/some/location' unset flist for i in "$@" do flist[${#flist[*]}]="$sloc/$i/$i".pdf flist[${#flist[*]}]="$sloc/$i/$i".txt done scp user@remote.server:"${flist[@]}" /somewhere/else/ - sloc='/some/location' unset flist for i in "$@" do flist[${#flist[*]}]="$sloc/$i/$i".pdf flist[${#flist[*]}]="$sloc/$i/$i".txt done scp user@remote.server:"${flist[@]}" /somewhere/else/ - sloc='/some/location' unset flist for i in "$@" do flist[${#flist[*]}]="$sloc/$i/$i".pdf flist[${#flist[*]}]="$sloc/$i/$i".txt done scp user@remote.server:"${flist[@]}" /somewhere/else/ 
  • настроить SSH на Linux для входа в систему без пароля
  • не удалось выполнить несколько команд на нескольких Linux-машинах?
  • Как загрузить файл с хоста, к которому я уже подключен, поверх ssh
  • Отправка файлов через Samba с помощью командной строки
  • передавать файл в удаленный каталог только в том случае, если он не существует без замены
  • Не могу использовать scp с wdmycloud
  • Как разбить массив в наборе из пяти файлов и загрузить их параллельно?
  • Я пытаюсь установить мой открытый ключ вручную w / scp
  • Автоматическая и безопасная передача файлов по двум серверам
  • Подавить сообщение сервера в rsync
  • Нужна программа командной строки для загрузки всех ссылок http: // https: // scp: // ftp: // style (например, ubuntu)
  • Linux и Unix - лучшая ОС в мире.