Os comandos Unix quase sempre (com muito poucas exceções) têm origem antes do destino. E a maioria permite múltiplas fontes antes do alvo final, se faz sentido fazê-lo.
Isso inclui scp
.
Alguns comandos (como as versões GNU de cp
e mv
) têm uma opção (por exemplo, -t
ou --target-directory=DIRECTORY
) que permite colocar o alvo em primeiro lugar - mas o padrão é o padrão "fonte (s) antes do alvo" . Isso é útil principalmente para que você possa ter o destino antes da origem ao usar algo como find ... -exec cp -t target/ {} +
, ou então evite usar -I {}
com xargs
(que é muito mais lento, faz com que xargs
bifurque um comando por arg, ao invés de caber tantos quanto puder em cada linha de comando), por exemplo ... | xargs -0r mv -t target/
em vez de ... | xargs -0r -I {} mv {} target/
Sem uma opção de anulação explícita, como mencionado acima, "alvo antes da fonte" é quase inédito - tão raro que você tem o direito de pensar "Huh? WTF?" se você alguma vez encontrar.
Se você precisar scp
de vários arquivos em várias máquinas de uma só vez, faça isso em um loop for assim:
for h in host1 host2 host3... ; do
scp file1 file2 file3... "user@$h:/path/"
done
Ou use pdcp
do Shell Distribuído Paralelo . pdsh
é empacotado para a maioria das distribuições do Linux.
por exemplo,
pdcp -w host1,host2,host3 file1 file2 file3 /path/to/target/
Esse é um exemplo muito simples, pdsh
tem um arquivo de configuração que você pode usar para definir hosts e grupos de hosts com nomes de grupos arbitrários (por exemplo, all
, webservers
, dbservers
, gpunodes
ou qualquer outra ). Você pode usá-los nos comandos pdsh
ou pdcp
:
pdsh -g all 'uname -a ; uptime'
pdcp -g webservers index.html /var/www/
Diferente do loop for
acima, ele não executa comandos nem copia os arquivos sequencialmente, um host de cada vez. Ele executa vários comandos em paralelo, com limites razoáveis baseados no número de núcleos de CPU que sua máquina possui.