Como scp com expressões regulares


13

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

A cópia 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 ideia?

Respostas:


17

Eu concordo com vonbrand. Globing é manipulado pelo shell em que você está rodando.scp user@machine:/path/* , expandirá / path / * para os arquivos em LOCAL / path / *, e não na máquina remota.

No entanto, apenas por sorrisos, tentei:

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

e .... funcionou. Tente isso. Observe as aspas. Muito necessário. Nos informe.

Nota: a conta do usuário na máquina remota pode ter como padrão um programa shell diferente do seu , portanto as regras de expansão de curingas podem ser diferentes, portanto, tenha cuidado.


1

Este não é "scp com expressões regulares", aquele que manipula os globs de arquivo é o shell. scpapenas recebe a lista de arquivos já expandida. E a expansão acontece na máquina em que o comando é executado.

Desculpe, não posso (facilmente) fazer.


Esta resposta está errada. Por favor, remova :)
Michael

1

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

Foi assim que acabei. E 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

Ambas as soluções funcionam para mim em um servidor 11.11.
DarkHeart

0

Os nomes remotos transmitidos para scpsão realmente interpretados como uma lista de padrões separados por espaços em branco no lado remoto. Isso costuma ser 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 e não 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 o bash e o zsh também suportam se você definir a opção apropriada). Então, isto só irá funcionar se o seu shell remoto é ksh, não se é algum outro shell e você exec kshde .profileou algo similar.

A maneira mais fácil, a menos que você esteja em algum tipo de ambiente restrito ou antigo, é esquecer scp. Você deseja que os arquivos remotos funcionem exatamente como os arquivos locais; portanto, torne-os arquivos locais: monte o diretório remoto com sshfs . Isso requer o FUSE na máquina local e um servidor SFTP (ou seja, um sftp-serverexecutável que é sshdiniciado) na máquina remota.

mkdir ~/net/machine
sshfs user@machine:/ ~/net/machine
cp -p ~/net/machine/path/!(a*) .
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.