web-dev-qa-db-fra.com

scp sans remplacer les fichiers existants dans la destination

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, je voudrais ajouter au contenu du dossier de destination)

169
biznez

Utilisez rsync et passez -u si vous souhaitez uniquement mettre à jour les fichiers plus récents dans le répertoire d'origine, ou --ignore-existing pour ignorer tous les fichiers qui existent déjà dans la destination.

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

(Noter la / côté source: sans lui rsync créerait /remote/directory/directory.)

scp écrasera les fichiers si vous y avez des droits d'écriture.

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

88
Reimund

Vous ne pouvez copier que les nouveaux fichiers par date. Utilisez find

scp  `find /data/*.gz -type f -mtime +7` USER@SERVER:/backup/
12
Naks

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

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

avant d'exécuter scp (il se plaindra et ignorera les fichiers existants).

Et changez-les ensuite (chmod +w pour obtenir une valeur basée sur umask). Si les fichiers n'ont pas tous une autorisation d'écriture en fonction de votre umask, vous devrez en quelque sorte stocker les autorisations afin de pouvoir les restaurer.

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

10
Mohad

Pour copier un tas de fichiers, il est plus rapide de les tarer. En utilisant -k, vous empêchez également tar de remplacer les fichiers lors de leur décompression sur le système cible.

tar -c <source-dir> | ssh <name>@<Host> 'tar -kxzf - -C <target-dir>' 
7
huembi

J'ai eu une tâche similaire, dans mon cas, je ne pouvais pas utiliser rsync, csync ou Fuse car mon stockage n'a que SFTP. rsync n'a pas pu modifier la date et l'heure du fichier, d'autres utilitaires (comme csync) m'ont montré d'autres erreurs: " Impossible de créer un fichier temporaire Horloge asymétrique détectée ".

Si vous avez accès au serveur de stockage - installez simplement openssh-server ou lancez rsync en tant que démon ici.

Dans mon cas - je ne pouvais pas faire cela et la solution était: lftp . L'utilisation de lftp pour la synchronisation est ci-dessous:

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

6
bolD

scp écrase les fichiers et il n'y a pas de commutateur pour l'empêcher de faire cela, mais vous pouvez copier les choses en chemin, faire le scp puis recopier les fichiers existants. Exemples:

  1. Copiez tous les fichiers existants

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

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

    cp -r original_files/* ./
    
0
A.Badger