Запись функции 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
  • scp не может загружать / скачивать файлы, даже если ssh работает
  • Тар и загрузка за один шаг по ssh / scp
  • scp / path / to / local / file myusername@server.com создает новый файл в локальном каталоге?
  • SCP от удаленного к локальному не работает
  • Почему SCP зависает при копировании файлов размером более 1405 байтов?
  • Как скопировать файлы с удаленного сервера unix в локальные окна?
  • scp файл с одного сервера на другой, получил «разрешение отказано»,
  • scp с использованием ssh-туннелирования
  • sshpass с SSH работает, но sshpass с SCP не
  • Невозможно scp в Дженкинсе
  • Interesting Posts
    Linux и Unix - лучшая ОС в мире.