Comment _MOVE_ fichiers avec scp?

46

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

man scpne m'a rien donné d'utile. Je ne peux pas utiliser 'scp' alors 'rm' car je dois m'assurer que le fichier a bien été transféré. En cas d'erreur lors du transfert, le fichier ne doit pas être supprimé.

Peut-être devrais-je utiliser le code de sortie d'une certaine manière, mais comment? En outre, il y a beaucoup de fichiers, et si le dernier fichier échoue, ce ne serait pas une bonne option, conservez la totalité des fichiers transférés avec succès.

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

Putnik
la source

Réponses:

47

rsync over ssh est probablement votre meilleur --remove-source-fileschoix avec l' option

rsync -avz --remove-source-files -e ssh /this/dir [email protected]:/remote/dir 

un test rapide donne;

[[email protected] ~]$ mkdir test1
[[email protected] ~]$ mkdir test2
[[email protected] ~]$ touch test1/testfile.1
[[email protected] ~]$ ls test1/
testfile.1
[[email protected] ~]$ rsync --remove-source-files -av -e ssh test1/testfile.1 [email protected]:/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

[[email protected] ~]$ ls test1/
[[email protected] ~]$
[[email protected] ~]$ ls test2/
testfile.1

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

Tom H
la source
7
-e sshest la valeur implicite par défaut depuis de nombreuses années, il n’est généralement plus nécessaire d’utiliser ce paramètre.
Sven
@SvenW ah bon à savoir! Je n'ai pas vraiment besoin de rsync au jour le jour, car scp prend en charge le mode récursif dans la plupart des cas.
Tom H
Après cela, utilisez ceci pour nettoyer tous les dossiers vides (rsync ne les supprimera pas): serverfault.com/a/95935/58568
bmaupin
1
Vient d'ajouter smv() { rsync -az --remove-source-files "[email protected]"; }à ma boîte à outils. Merci.
Rhys Ulerich
Et si vous n'avez pas rsync? Par exemple, OpenWrt n'a pas rsync et j'ai besoin d'utiliser scp pour déplacer des fichiers. Que faire maintenant?
valentt
19

Utilisez rsyncau lieu de scp:

rsync -avz --remove-source-files /sourcedir [email protected]:/targetdir 

Plus d'infos avec man rsync.

Sven
la source
17

La réponse à cette question a été très bien, et la réponse a été acceptée, mais comme elle a été placée en haut de la page de couverture, je pensais au moins que j'essaierais d'y répondre plus précisément, mais avec moins d'élégance. Oui, vous pouvez utiliser le code de retour de scp, et je le fais souvent. Dans bash:

scp foo [email protected]:/destination && rm foo

Je comprends votre point sur la copie de plusieurs fichiers et la gestion des échecs en pile correctement, donc pour plusieurs fichiers:

for file in bar*; do scp "$file" [email protected]:/destination && rm "$file" ; done

Ce dernier n’est pratique que si vous utilisez ssh-agent, mais j’espère bien que vous l'êtes.

MadHatter soutient Monica
la source
1
Je pense que cela aurait dû être la réponse. Cela répond à la question posée avec précision.
Travis Griggs
Comme SCP ne gère pas la limite de bande passante (autant que je sache), j'ai utilisé votre réponse avec rsync pour déplacer les fichiers un par un avec une bande passante définie. Merci !
Moonchild
@Moonchild, scp peut gérer les limites de bande passante à l'aide de l' -lindicateur. Par exemple, -l 8192pour limiter les transferts à 8192 kb / s
Spencer D
3

dans ma situation, le port ssh n’est pas 22, donc

rsync -avz --remove-source-files -e "ssh -p $portNumber" [email protected]:/path/to/files/ /local/path/

travaille pour moi.

gros chat
la source
5
Vous feriez bien mieux de mettre des numéros de port ssh personnalisés dans votre fichier de configuration ssh (~ / .ssh / config) plutôt que de les spécifier pour chaque commande. Il peut être spécifié globalement, par hôte ou pour une expression régulière correspondant au nom d'hôte.
sneak
Comment définir les ports individuellement pour la source et la destination?
Brethlosze
3

si vous avez le même serveur cible que moi, vous ne pouvez pas utiliser

--remove-source-files

mais vous devez utiliser

--remove-sent-files --protocol=29

au lieu.

Andrej
la source
3

Si cela ne pose pas de problème en deux étapes, vous pouvez utiliser scppour copier le fichier à partir du serveur distant, puis exécuter ssh -e "rm /path/to/file"pour le supprimer du disque. Lorsque vous déplacez des fichiers, en particulier entre ordinateurs, les choses peuvent mal tourner, il peut donc être judicieux d’effectuer la copie et la suppression séparément, et de ne supprimer le fichier que si vous êtes certain qu’il a bien été copié en premier.

Giannis
la source