Use tar
:
tar cvzf - -T list_of_filenames | ssh hostname tar xzf -
Eu tenho que transportar muitos arquivos de um PC para outro (ambos Linux). Eu gostaria de usar scp
para isso, mas scp
só permite transferir um arquivo de cada vez.
Como posso fazer isso?
Eu tenho
Se possível, eu gostaria de gzip e soltar transparentemente para economizar largura de banda!
Isso é possível?
Use tar
:
tar cvzf - -T list_of_filenames | ssh hostname tar xzf -
I would like to use scp for that, but scp only allows for transferring one file at a time.
Tenho certeza de que isso não é verdade, pelo menos não para o comando scp
fornecido pelo OpenSSH incluído na maioria das distribuições Linux.
Eu uso scp file1 file2 ... fileN user@host:/destination/directory/
com bastante frequência.
Para compactação transparente, o protocolo SSH foi incorporado e scp
pode usá-lo se você fornecer a opção -C
na linha de comando. Para muitos arquivos pequenos semelhantes, você encontrará a opção tar + gz sugerida pelo akira, que ganha uma melhor compactação, pois pode fazer uso da similaridade entre esses arquivos, em que scp
compacta cada arquivo como uma entidade separada. Eu geralmente prefiro usar scp, já que é mais fácil retomar uma transferência parcial (ou, embora eu saiba que nesta situação o questionador não tem a opção) rsync
, pois é ainda mais fácil retomar e compartilhar o tar + Vantagem de compressão de todo o fluxo da opção gz.
Não scp -r yourdir otherhost:/otherdir
funciona?
Tente isso então:
tar cfz - . | ssh otherhost "cd /mydir; tar xvzf -"
o z
-flag para tar faz a compactação. Ou você pode usar -C para ssh:
tar cf - . | ssh -C otherhost "cd /mydir; tar xvf -"
No RHEL5, aqui está a única maneira possível de proteger uma cópia de uma lista de arquivos que contenham caracteres especiais (como um espaço). Faça um script de shell e inclua o seguinte:
FILE="/path/filename"
while read line; do
scp "$line" username@servername:/destination/
done < $FILE
Isso pode ser feito sem muitos problemas.
Eu simplesmente crio uma lista de arquivos com o nome do host ao lado de cada arquivo e o scp parece analisá-lo bem. ie.
srchost='hostname'
myfiles="${srchost}:~/.bashrc ${srchost}:~/.bash_profile ${srchost}:~/.vimrc ${srchost}:~/.viminfo ${srchost}:~/.toprc ${srchost}:~/.dir_colors"
scp -v $myfiles $HOME
O Scp parece funcionar bem com esta sintaxe. Como eu tentei sem o nome do host ao lado de cada arquivo, ele falhou após o primeiro arquivo. Eu me lembro de outra sintaxe que eu usei para isso antes e vou postar uma vez que eu localizá-lo.
Eu recomendaria às partes que usem um comando como este para criar um arquivo da sua lista de arquivos
tar -cvf allfiles.tar -L mylist.txt
Em seguida, use scp para baixar o arquivo.
usuário scp @ remotehost: ~ / allfiles.tar