Comment copier uniquement les nouveaux fichiers en utilisant la commande "scp"?

24

J'étais en train de copier des centaines de fichiers sur un autre ordinateur en utilisant la scpcommande que j'ai eu l' stalled erreur . Maintenant, je vais à nouveau copier les fichiers. Existe-t-il un moyen d'éviter de copier les fichiers déjà copiés?

Meysam
la source

Réponses:

40

Vous pouvez l'utiliser rsyncpour cela. rsyncest vraiment conçu pour ce type d'opération.

Syntaxe:

rsync -avh /source/path/ host:/destination/path

ou

rsync -a --ignore-existing /local/directory/ host:/remote/directory/

Lorsque vous l'exécutez pour la première fois, il copiera tout le contenu, puis ne copiera que les nouveaux fichiers.

Si vous avez besoin de tunneler le trafic via une connexion SSH (par exemple, à des fins de confidentialité), comme indiqué par votre demande initiale d'une solution basée sur SCP, ajoutez simplement -e sshles paramètres à rsync. Par exemple:

rsync -avh -e ssh /source/path/ host:/destination/path
un CVn
la source
Est-ce --ignore-existingvraiment nécessaire?
Meysam
Parce que dans cet exemple de manuel: rsync -t *.c foo:src/-> "Cela transfèrerait tous les fichiers correspondant au modèle * .c du répertoire actuel vers le répertoire src sur la machine foo. Si l'un des fichiers existe déjà sur le système distant, alors la télécommande rsync - le protocole de mise à jour est utilisé pour mettre à jour le fichier en n'envoyant que les différences "
Meysam
1
J'utilise généralement rsync -avuzh /source/path/ host:/destination/path. Cela fait tout le travail en une seule commande, et lors des appels suivants, ne transfère que les fichiers qui en ont besoin.
Edward Falk
6

Si vous souhaitez rester avec scp pour une raison quelconque, vous pouvez supprimer les autorisations w sur vos données locales (si vous en avez le droit) et scp ne les touchera pas. Être plus précis:

  1. chmod a-w local/*.tar.gz (dans votre répertoire local)
  2. scp remote/*.tar.gz local

Ce n'est pas très efficace, agréable mais pourrait aider si vous avez besoin d'une solution temporaire rapide sans changer pour autre chose que scp. (Kudos: scp sans remplacer les fichiers existants dans la destination )

xhudik
la source
J'aime vraiment cette solution. Je collecte des fichiers de capteurs distants dans une archive. Tous les répertoires de travail ont chacun un sous-répertoire Archive. Une fois que les fichiers sont archivés, ils ne seront jamais modifiés. Il serait très facile de marquer les fichiers archivés en tant que -w, ce sera donc ce que je fais. Et les fichiers de travail en dehors des répertoires d'archives peuvent être laissés tels quels, donc si j'exécute le programme de mise à jour pendant la journée, il copiera toujours les fichiers en cours. C'est précisément ce que je cherchais. TNX beaucoup!
SDsolar
4

Il n'y avait pas de réponse exacte sur la façon de procéder avec SCP, car c'était ce que la question initiale demandait.

sudo find /files/ -type f -exec chmod a-w {} \;

scp -r [email protected]:/file/location/* /files

Une fois la copie des fichiers terminée, modifiez à nouveau les autorisations:

sudo chmod a+w -R /files

Meule
la source
1
Eh bien, sans doute, la question d'origine était "comment puis-je résoudre ce problème", pour laquelle rsync est la réponse.
Edward Falk