Como scp com expressões regulares

9

Estou tentando copiar todos os arquivos que não começam com a letra "a", em ksh.

Copiar da máquina de origem para a máquina de destino está funcionando bem :

scp -p !(a*) user@machine:/path/directory/.

Mas, se eu estiver no servidor de destino e quiser copiar do servidor de origem, está falhando:

scp -p user@machine:/path/!(a*) .

Alguma idéia?

    
por Ryan P 06.03.2013 / 16:43

4 respostas

13

Concordo com vonbrand. Globing é tratado pelo shell em que você está executando. Portanto, scp user@machine:/path/* expandirá / path / * para os arquivos em LOCAL / path / *, não na máquina remota.

No entanto, apenas para sorrisos eu tentei:

scp "user@machine:/path/[regex here]" .  

e .... funcionou. Tente isso. Observe as aspas. Muito necessário. Deixe-nos saber.

Nota: a conta de usuário na máquina remota pode usar como padrão um programa de shell diferente de seu , portanto as regras de expansão de curingas podem ser diferentes, então 'ware that.

    
por 06.03.2013 / 21:32
1

Isto não é "scp com expressões regulares", o que lida com o arquivo globs é o shell. scp apenas recebe a lista já expandida de arquivos. E a expansão acontece na máquina onde o comando é executado.

Desculpe, não posso (facilmente) fazer isso.

    
por 06.03.2013 / 17:15
1

O que eu achei foi que em máquinas HP-UX mais antigas (parisc 11.11), eu tive que usar [^ a] * Mas, em máquinas mais novas (parisc 11.31 e mais recentes), funciona com! (A *)

Foi com isso que acabei. E isso funciona:

    if [[  ${S_MACH} = "phd026a" || ${S_MACH} = "tht030a" ]]
    then
            scp -p -r ${S_MACH}:${S_DIR}/bin/[^a^b^c^p]* ${D_DIR}/bin/.
    else
            scp -p -r ${S_MACH}:${S_DIR}/bin/!((a*)|(b*)|(c*)|(p*)) ${D_DIR}/bin/.
    fi
    
por 27.02.2015 / 19:25
0

Os nomes remotos transmitidos para scp são realmente interpretados como uma lista de padrões separados por espaço em branco no lado remoto. Isso geralmente é um aborrecimento quando você tenta copiar um arquivo cujo nome contém espaços, mas aqui é útil: scp -p 'user@machine:/path/a*' . copia todos os arquivos cujo nome começa com a .

Seu comando funcionará se você citar o padrão para que seja interpretado remotamente em vez de localmente, desde que você passe por outro obstáculo. O padrão !(a*) não é um padrão básico de shell, é uma extensão ksh (que bash e zsh também suportam se você definir a opção apropriada). Portanto, isso só funcionará se o shell remoto for ksh, não se for algum outro shell e você exec ksh de .profile ou algo semelhante.

A maneira mais fácil, a menos que você esteja em algum tipo de ambiente restrito ou antigo, é esquecer scp . Você gostaria que os arquivos remotos funcionassem como os arquivos locais, portanto, crie arquivos locais: monte o diretório remoto com sshfs . Isso requer o FUSE na máquina local e um servidor SFTP (ou seja, um executável sftp-server que sshd lança) na máquina remota.

mkdir ~/net/machine
sshfs user@machine:/ ~/net/machine
cp -p ~/net/machine/path/!(a*) .
    
por 07.03.2013 / 01:33

Tags