2

У меня есть скрипт bash, который копирует несколько файлов на удаленный сервер с помощью scp. Этот скрипт работает нормально, но теперь мне нужно добавить файл, который содержит подстановочный знак в имени, и у меня есть проблема с ним.

#!/bin/sh
files=('path1/subpath/file.*.ext' 'path2/subpath2/nowildcard.ext2' 'path3/subpath3/file3.*.ext3');

for j in "${files[@]}"; do
    echo "File \033[1;38;5;226m$j\033[0m is copying."
    scp -P12345 $j "name@host:/permanent/path/$j";
done

Сценарий копирует файлы с подстановочными знаками (например, file.12345.ext или file3.4321.ext3), но сохраняет на удаленном сервере в виде файла.* .ext и file3.* .Ext3. Я попытался использовать обратную косую черту в именах файлов, но в этом случае скрипт вообще не копирует файлы.

Как исправить эту проблему?

Заранее спасибо.

1 ответ1

3

Массивы не доступны в /bin /sh, поэтому используйте #!/bin/bash

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

Подстановочные знаки не расширяются, потому что вы добавляете их в массив с кавычками, а затем вы заключаете в кавычки расширение массива в цикле for, поэтому подстановочные знаки тоже не раскрываются.

Позвольте подстановочным знакам расширяться, когда вы сохраняете их в массиве, и отправляете все имена файлов отдельно в качестве аргументов scp:

#!/bin/bash
files=( 
    path1/subpath/file.*.ext 
    path2/subpath2/nowildcard.ext2 
    path3/subpath3/file3.*.ext3
)
scp -P12345 "${files[@]}" name@host:/permanent/path/

Вы можете еще больше упростить, полностью опустив массив, и в этом случае вы можете вернуться к /bin /sh:

#!/bin/sh
scp -P12345                         \
    path1/subpath/file.*.ext        \
    path2/subpath2/nowildcard.ext2  \
    path3/subpath3/file3.*.ext3     \
    name@host:/permanent/path/

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .