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.

Ouvrez la voie
la source
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

user31894
la source
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)

Balmipour
la source
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.

Martin Beckett
la source
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.

Pointu
la source
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
grepit
la source
1

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

# cp -au

Regardez aussi rsync

pixelbeat
la source
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
Kamil Maciorowski
la source
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.

taatparya
la source