Copiez des fichiers sous Linux, évitez la copie si des fichiers existent dans la destination


32

J'ai besoin de copier un dossier / home / user d'un disque dur à un autre. Il a 100 000 fichiers et une taille d'environ 10G.

j'utilise

cp -r /origin /destination

parfois je reçois des erreurs en raison de liens rompus, d'autorisations, etc. Je corrige donc l'erreur et je dois recommencer la copie.

Je me demande comment pourrais-je dire à la commande "cp", une fois qu'il essaie de copier à nouveau, de ne pas copier à nouveau les fichiers s'ils existent dans le dossier de destination.


2
Ne nous cp. Utilisez plutôt rsync.
William Pursell

Réponses:


22

cp -R -u -p /source /destination

Le drapeau -u( ou--update ) fait juste ceci:

Depuis la page de manuel de cp:

-u, --update

copier uniquement lorsque le fichier SOURCE est plus récent que le fichier de destination ou lorsque le fichier de destination est manquant


6
Pour ne copier que des fichiers qui n'existent pas et ne pas mettre à jour ceux qui existent, yes n | cp -i /source/* /destination 2>/dev/null
sventechie

4
-u, --update copie uniquement lorsque le fichier SOURCE est plus récent que le fichier de destination ou lorsque le fichier de destination est manquant -u, --update copie uniquement lorsque le fichier SOURCE est plus récent que le fichier de destination ou lorsque le fichier de destination est manquant -p identique à --preserve = mode, propriété, horodatages --preserve [= ATTR_LIST] conserve les attributs spécifiés (par défaut: mode, propriété, horodatages), si possible des attributs supplémentaires: contexte, liens, xattr, tous
Covich

51

Utilisez simplement cp -n <source> <dest>.

Depuis la page de manuel :

-n, --no-clobber

NE PAS écraser un fichier existant (remplace une option -i précédente)


7
C'est la seule vraie réponse à la question.
sebix

20

rsync -aq /src /dest

En plus de copier uniquement les fichiers les plus récents, il ne copiera même les parties les plus récentes des fichiers que si le fichier a changé. Il est destiné à copier sur des liens réseau où vous souhaitez minimiser la quantité de données - mais il fonctionne également très bien localement.


Je ne peux pas ajouter de formatage à votre message car il ne s'agit que de deux caractères. Que penseriez-vous de la modifier et d'ajouter des `` caractères autour de votre commande?
culix

4

Recherchez l'option "-u" pour la cpcommande.


2
Ne pas accepter que l'utilisation de -u soit une bonne idée. -u copie uniquement lorsque la source est plus récente ou la destination manquante. Le problème de l'affiche originale a été causé par une rupture de copie du fichier pour une raison quelconque. OP aurait donc un fichier à moitié écrit qui n'était pas mis à jour lors de la réexécution de la copie. Ce fichier pourrait être important pour quelqu'un! rsync résout ce problème.
hazymat

2

Toutes les réponses ci-dessus sont correctes mais si vous le faites récursivement,

tu devrais faire:

 cp -rn SOURCE_PATH DESTINATION_PATH

1

Vous devez copier en tant que root pour conserver les autorisations / la propriété

# cp -au

Regardez aussi rsync


1

Solution POSIX

Autres réponses utilisent -u ou -noptions de cp. Aucun de ces éléments n'est requis par POSIX ; ni rsyncd'une autre réponse encore; ni yesutilisé dans l'un des commentaires.

Nous pouvons toujours reproduire yes navec une whileboucle. Cela conduit à la solution POSIX suivante:

while true; do echo n; done | cp -Ri /origin /destination 2>/dev/null

0

Utilisation cp -rn <sourcedirname>/. <destdirname>

Le commutateur r rend la copie récursive sur les répertoires.

Le commutateur n (version longue sans clobber) garantit que les fichiers existants ne sont jamais écrasés.

Le ' /.' après le sourcedirname garantit qu'il ne deviendra pas un sous-répertoire sous le destdirname au lieu que tout le contenu du premier soit copié dans le second.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.