scp sans remplacer les fichiers existants dans la destination

158

Comment copier un répertoire entier dans un répertoire du même nom sans remplacer le contenu du répertoire de destination? (au lieu de cela, j'aimerais ajouter au contenu du dossier de destination)

Daniel Böhmer
la source
Oui, il est embêtant lorsqu'un programme / utilitaire utile ne dispose pas de l'option "si seulement il pouvait ..."! Dans ce cas, "--noclobber"!
MikeW

Réponses:

140

Utilisez rsyncet passez -usi vous voulez mettre à jour uniquement les fichiers les plus récents du répertoire d'origine ou --ignore-existingignorer tous les fichiers déjà présents dans la destination.

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

(Notez le /côté source: sans cela rsync, il créerait /remote/directory/directory.)

Gilles
la source
@ Anthony Je ne comprends pas votre commentaire et je ne vois pas de réponse ou de commentaire de la part de Chandra. --ignore-existingajoute sans remplacer, quelle perte de données voyez-vous?
Gilles
Désolé, j'ai seulement regardé votre premier exemple, c'est-à-dire que vous pouvez avoir une perte de données (et IMHO n'est pas ce que le PO a demandé), si vous incluez - une perte de données existante en igno ne devrait pas se produire.
Anthon
Cela n'aide pas si le système distant n'a pas rsyncfacilement disponible .... (comme Win32-OpenSSH)
Gert van den Berg
@GertvandenBerg rsync est assez facile à installer sous Windows, pas plus difficile que SSH.
Gilles
@Gilles: C'est vrai, mais toutes les options semblent impliquer des DLL Cygwin ... (L'état actuel du port MS d'OpenSSH est tel que l'activation de la compression sur scp suffit à casser SCP ...) (Fonctionnement de rsync sous Win32 -OpenSSH semble également non négligeable - espérons que cela s'améliorera avec le temps) (Solaris 10 est l'autre exemple, où un package tiers --rsync-pathest nécessaire)
Gert van den Berg
82

scp écrasera les fichiers si vous avez des droits en écriture.

En d'autres termes: vous pouvez faire scpen sorte que les fichiers soient ignorés en supprimant temporairement les autorisations d'écriture sur ces fichiers (si vous êtes le propriétaire des fichiers, c'est-à-dire).

Reimund
la source
5
Merci pour cela. C'était exactement le truc que je cherchais.
saccharine
Assurez-vous de recopier les fichiers et ajoutez un * pour le faire. Exemplescp -r [email protected]:/location/of/files/* /local/location/
Rick
1
trouver . -type f -exec racine chown: root {} \;
ling
1
Dans le cas inhabituel où seuls certains des fichiers du répertoire sont censés être écrasés (s'ils ne sont pas "protégés") et que les autorisations de fichiers ne sont pas uniformes d'un fichier à l'autre, cette solution risque de ne pas fonctionner. Sinon, c'est assez simple et efficace.
Sancho.s
Pour ce faire sur windows sélectionnez tous les fichiers, faites un clic droit -> propriétés -> lecture seule
BenJammin
12

Vous ne pouvez copier que les nouveaux fichiers par date. Utilisationfind

scp  `find /data/*.gz -type f -mtime +7` USER@SERVER:/backup/
Naks
la source
que signifie +7?
Francis Kim
@FrancisKim cela signifie modifié il y a 7 jours. Donc, cette requête sélectionne tous les fichiers * .gz modifiés au cours des 7 derniers jours
Vadim Eremeev
4
Le chiffre +7 ne signifie-t-il pas plus de 7 jours auparavant?
Jeff H.
1
Oui, cela signifie "il y a plus de 7 jours". Aucune idée de qui a voté pour ça.
Stefan Reich
9

Si vous pouvez rendre le contenu du fichier de destination en lecture seule:

find . -type f -exec chmod a-w '{}' \;

avant de courir scp(il va se plaindre et sauter les fichiers existants).

Et modifiez-les ensuite ( chmod +wpour obtenir une valeur basée sur umask). Si tous les fichiers n’ont pas l’autorisation d’écrire en fonction de votre umask, vous devrez peut-être stocker ces autorisations pour pouvoir les restaurer.

(La réponse de Gilles écrase les fichiers existants si, localement, ils sont plus récents, j'ai perdu de précieuses données de cette façon. Je ne comprends pas pourquoi cette réponse fausse et nuisible a autant de votes positifs).

Mohad
la source
2
Je ne comprends pas: comment rsync --ignore-existingavez-vous perdu des données?
Gilles
4
J'ai eu l'erreur en find: missing argument to '-exec'utilisant cette commande, et avait plutôt à utiliser: find . -type f -exec chmod a-w {} \;. Mon linux est mauvais, ymmv.
wpearse
C'est une réponse meilleure et plus sûre. La commande correcte pour changer l'autorisation est comme mentionné par @wpearse:find . -type f -exec chmod a-w {} \;
Amir
6

J'ai eu une tâche similaire, dans mon cas , je ne pouvais pas utiliser rsync, csyncou FUSE parce que mon stockage a seulement SFTP. rsyncimpossible de changer la date et l’heure du fichier, certains autres utilitaires (du type csync) m’ont montré d’autres erreurs: « Impossible de créer un fichier temporaire Clock skew détecté ».

Si vous avez accès au serveur de stockage, installez-le openssh-serverou lancez-le en rsynctant que démon ici.

Dans mon cas, je ne pouvais pas faire cela et la solution était: lftp . lftpL'utilisation de Syncronization est la suivante:

lftp -c "open -u login,password sftp://sft.domain.tld/; \
    mirror -c --verbose=9 -e -R -L /srs/folder /rem/folder"

/src/folder- est le dossier sur mon PC, /rem/folder- est sftp://sft.domain.tld/rem/folder.

Vous pouvez trouver des pages de manuel par le lien: http://lftp.yar.ru/lftp-man.html

audacieux
la source
6

Pour copier tout un tas de fichiers, il est plus rapide de les archiver. En utilisant -k, vous évitez également que tar écrase les fichiers lors de sa décompression sur le système cible.

tar -c <source-dir> | ssh <name>@<host> 'tar -kxzf - -C <target-dir>' 
huembi
la source
1
Il établit une connexion à distance. D'abord, c'est la source, elle la dirige vers la connexion ssh et la décompresse sur le système distant.
huembi
-1

scpécrase les fichiers et il n’ya pas d’interrupteur pour l’interrompre, mais vous pouvez copier des choses comme vous le voulez, faire le scp, puis copier les fichiers existants. Exemples:

  1. Copiez tous les fichiers existants en chemin

    mkdir original_files ; cp -r * original_files/
    
  2. Copier tout en utilisant scp

    scp -r user@server:dir/* ./
    
  3. Copiez les fichiers originaux sur tout ce que scp a écrit:

    cp -r original_files/* ./
    
A.Badger
la source
3
Cette méthode ne vous aide pas lorsque vous essayez de récupérer des fichiers depuis une télécommande et de reprendre là où vous les avez laissés. C'est-à-dire si l'objectif est de gagner du temps.
Oliver Williams
-1

Pour ce faire, vous pouvez également effectuer une opération lsdans le dossier de destination:

Sur le dossier de destination distant:

ls | awk '{print "mv " $1 " ../copied_data/"}' > mv_copied_data
scp mv_copied_data [email protected]:/path/to/source/folder

Sur source:

cd /path/to/source/folder
chmod 777 mv_copied_data
./mv_copied_data

Sur la destination:

scp -r [email protected]:/path/to/source/folder /path/to/destination/foldeer
Sameer Gurjar
la source
S'il vous plaît ne faites pas ça. 1. Ne pas analyser ls . 2. La réponse est dangereuse si un nom de fichier contient une - >nouvelle ligne ou d'autres caractères spéciaux. 3. Coder en dur une boucle for dans un script python. Générer un programme à l'exécution est difficile et délicat (même lorsqu'il est effectué par des programmeurs professionnels), pour de nombreuses raisons. Générer un script shell est encore pire - une idée terrible.
Ignis