Usando curingas no comando scp


2

Eu tenho um script bash que copia vários arquivos para um servidor remoto usando scp. Este script funciona bem, mas agora eu preciso adicionar um arquivo que contenha um curinga no nome e eu tenho um problema com ele.

#!/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

O script copia os arquivos com curinga (por exemplo, file.12345.ext ou file3.4321.ext3), mas salva no servidor remoto como arquivo. * .Ext e file3. *. Ext3. Tentei usar uma barra invertida nos nomes dos arquivos, mas nesse caso o script não copia os arquivos.

Como consertar este problema?

Desde já, obrigado.

Respostas:


3

Matrizes não são um recurso encontrado em / bin / sh, portanto, use #!/bin/bash

O scp, por padrão, mostra o progresso dos arquivos transferidos, por isso questiono se você realmente precisa imprimir cada nome de arquivo sozinho.

Seus curingas não estão se expandindo porque você os adiciona à matriz com aspas e, em seguida, cita a expansão da matriz no loop for, para que os curingas também não sejam expandidos.

Deixe os curingas se expandirem quando você os armazenar na matriz e envie todos os nomes de arquivos separadamente como argumentos scp:

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

Você pode simplificar ainda mais, omitindo a matriz por completo. Nesse caso, você pode voltar para / bin / sh:

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

Obrigado pela ajuda. No entanto, deixe-me discordar um pouco de você :). Este script funciona perfeitamente com / bin / sh (Mac OS 10.9). A solução que você me forneceu funciona. Ele copia os arquivos com os curingas file.12345.ext e file3.4321.ext3, mas os salva no diretório raiz (/ permanente / caminho /). Mas preciso manter seus caminhos originais. É por isso que usei / permanente / caminho / $ j no meu script. Você está certo sobre as aspas - essa foi a origem do problema. Acabei de removê-los no meu script e ele começou a funcionar como deveria. Muito obrigado pela sua ajuda!
Ssey

Você está se safando #!/bin/shporque, nas versões recentes do OS X, shestá realmente bashsendo executado no modo de compatibilidade. Mas só porque você pode se safar, não significa que é uma coisa razoável a se fazer.
Gordon Davisson
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.