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?
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.
Utilisez rsync
au lieu de scp
:
rsync -avz --remove-source-files /sourcedir user@Host:/targetdir
Plus d'infos avec man rsync
.
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.
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.
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.
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.
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: