web-dev-qa-db-fra.com

Comment _MOVE_ fichiers avec scp?

Comment ne pas copier mais déplacer des fichiers d'un serveur à un autre (les deux 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é. En cas d'erreur lors du transfert, le fichier ne doit pas être supprimé.

Je devrais peut-être utiliser le code de sortie 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 de conserver tout le tas de fichiers transférés avec succès.

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

50
Putnik

rsync sur ssh est probablement votre meilleur pari 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 omis.

50
Tom H

Utilisez rsync au lieu de scp:

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

Plus d'infos avec man rsync.

20
Sven

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

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

Je prends votre point sur plusieurs fichiers pour copier et gérer correctement l'échec de la pile, donc pour plusieurs fichiers:

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

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

18
MadHatter

Si le faire en deux étapes n'est pas un problème, vous pouvez utiliser scp pour copier le fichier à partir du serveur distant, puis exécuter ssh -e "rm /path/to/file" pour supprimer du disque. Lors du déplacement de fichiers, en particulier entre des machines, les choses peuvent mal se passer, il peut donc être judicieux d'effectuer la copie et la suppression séparément, et de ne supprimer le fichier que lorsque vous savez avec certitude qu'il a été copié avec succès en premier.

3
Giannis

si vous avez un serveur cible plus ancien que moi, vous ne pouvez pas utiliser

--remove-source-files

mais vous devez utiliser

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

au lieu.

3
andrej

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/

travaille pour moi.

3
bigCat

J'ai pensé suggérer une alternative à rsync que j'ai trouvée, lftp, car rsync nécessite un accès Shell que mon serveur sftp bloque.

lftp -e "mirror --Remove-source-files ./remote/path/ /local/path/; quit" remoteuser@remotehost:

Vous pouvez également saisir le mot de passe si vous devez l'exécuter dans le cadre d'un processus de traitement par lots/cron (évidemment non sécurisé)

lftp --password hunter2 -e "mirror --Remove-source-files ./remote/path/ /local/path/; quit" remoteuser@remotehost:
0
Andy C