Os nomes remotos transmitidos para scp
sã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 ksh
de .profile
ou 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-server
executável que é sshd
iniciado) na máquina remota.
mkdir ~/net/machine
sshfs user@machine:/ ~/net/machine
cp -p ~/net/machine/path/!(a*) .