64 votes

Comment _MOVE_ des fichiers avec scp ?

Comment ne pas copier mais déplacer des fichiers d'un serveur à un autre (tous deux sous Linux) ?

man scp ne m'a rien donné d'utile. Je ne peux pas utiliser 'scp' puis 'rm' car je dois m'assurer que le fichier a bien été transféré. S'il y a une erreur pendant le transfert, le fichier ne doit pas être supprimé.

Je devrais peut-être utiliser l'exit code d'une manière ou d'une autre, mais comment ? De plus, il y a beaucoup de fichiers, et si le dernier fichier échoue, ce ne serait pas une bonne option pour conserver l'ensemble des fichiers transférés avec succès.

Peut-être qu'il y a autre chose que SCP ?

62voto

Tom Points 10766

Rsync sur ssh est probablement votre meilleure chance avec le --remove-source-files option

rsync -avz --remove-source-files -e ssh /this/dir remoteuser@remotehost:/remote/dir 

un test rapide donne ;

[tomh@workstation001 ~]$ mkdir test1
[tomh@workstation001 ~]$ mkdir test2
[tomh@workstation001 ~]$ touch test1/testfile.1
[tomh@workstation001 ~]$ ls test1/
testfile.1
[tomh@workstation001 ~]$ rsync --remove-source-files -av -e ssh test1/testfile.1 tomh@localhost:/home/tomh/test2/
sending incremental file list

sent 58 bytes  received 12 bytes  10.77 bytes/sec
total size is 0  speedup is 0.00

[tomh@workstation001 ~]$ ls test1/
[tomh@workstation001 ~]$
[tomh@workstation001 ~]$ ls test2/
testfile.1

Comme l'a mentionné @SvenW, -e ssh est la valeur par défaut et peut donc être omise.

26voto

Sven Points 95985

Utilice rsync au lieu de scp :

rsync -avz --remove-source-files /sourcedir user@host:/targetdir 

Plus d'infos avec man rsync .

25voto

MadHatter Points 77602

Cette question a déjà reçu une réponse satisfaisante, et la réponse a été acceptée, mais puisqu'elle a été placée en haut de la première page, je me suis dit que j'allais au moins essayer d'y répondre de manière plus précise, même si elle est moins élégante. Oui, vous pouvez utiliser le code de retour de scp et je le fais souvent. Sur bash :

scp foo user@server:/destination && rm foo

Je comprends votre point de vue sur les fichiers multiples à copier et la gestion correcte des échecs dans la pile, donc pour les fichiers multiples :

for file in bar*; do scp "$file" user@server:/destination && rm "$file" ; done

Cette dernière n'est pratique que si vous utilisez ssh-agent mais j'espère vraiment que vous l'êtes.

5voto

Giannis Points 41

Si le faire en deux étapes n'est pas un problème, vous pouvez utiliser scp pour copier le fichier depuis le serveur distant, puis exécutez ssh -e "rm /path/to/file" à supprimer du disque. Lorsque vous déplacez des fichiers, notamment d'une machine à l'autre, les choses peuvent mal tourner. Il est donc préférable d'effectuer la copie et la suppression séparément, et de ne supprimer le fichier que lorsque vous êtes certain qu'il a été copié avec succès.

3voto

guest Points 1

Dans ma situation ,le port ssh n'est pas 22, donc

rsync -avz --remove-source-files -e "ssh -p $portNumber" user@remoteip:/path/to/files/ /local/path/

fonctionne pour moi.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X