Linux comment copier mais pas écraser?


Réponses:


589

Tiré de la page de manuel :

-n, --no-clobber
              do not overwrite an existing file (overrides a previous -i option)

Exemple:

cp -n myoldfile.txt mycopiedfile.txt

33
Notez que cela se terminera avec une erreur si le fichier existe. Pour sortir avec succès, essayez cp -n source.txt destination.txt || true
galenandrew

13
@galenandrew cp -nne se ferme pas avec une erreur si le fichier existe sur Ubuntu 12.04.
Amit

@galenandrew Confirmé. Je vous remercie. Mon projet n'était pas en cours de construction dans Xcode après avoir ajouté un script d'exécution à ma cible.
Ruiz

@AaronFranke ressemble à ça.
Boris

93

Pensez à utiliser rsync.

rsync -a -v --ignore-existing src dst

Selon les commentaires rsync -a -v src dstn'est pas correct car il mettra à jour les fichiers existants.


7
Vous souhaitez ajouter l' --ignore-existingindicateur pour empêcher l'écrasement des fichiers existants.
Tous les travailleurs sont essentiels

7
La commande complète rsync -a -v --ignore-existing <src> <dst>est en effet la bonne réponse, au lieu de cp -uci - dessus.
Whitebird

Si une copie précédente a été interrompue et que seul un fichier tronqué a été copié, je suis sûr que cp -u ne la recopiera pas ... mais rsync, avec --ignore-existing? Probablement pas non plus ... ce qui les rend parfaitement équivalents, non?
dagelf

rsync conserve l'horodatage du fichier tandis que cp utilise l'heure actuelle (d'après mon expérience)
Stefan Diabo

1
certains serveurs n'ont tout simplement pas de rsync
mebada

51
cp -n

C'est ce que tu veux. Voir la page de manuel.


@AaronFranke oui, cela fonctionnera récursivement.
Boris

33

Cela fonctionnera sur RedHat:

false | cp -i source destination 2>/dev/null

La mise à jour et non l'écrasement est quelque chose de différent.


4
Que fait false-on ici?
Frozen Flame

11
@FrozenFlame Répond aux -iquestions.
ceving

De toute évidence, cette commande ne fonctionnera pas si vous essayez de copier plus de fichiers ARG_MAX. Pour contourner ce cas, consultez ce lien .
mginius

2
De toute évidence, cette commande ne fonctionnera pas si la terre s'écrase au soleil.
ceving

32

Pour les personnes qui n'ont pas d'option 'n' (comme moi sur RedHat), vous pouvez utiliser cp -upour écrire le fichier uniquement si la source est plus récente que celle existante (ou s'il n'y en a pas déjà une).

[modifier] Comme mentionné dans les commentaires, cela écrasera les fichiers plus anciens, ce n'est donc pas exactement ce que l'OP voulait. Utilisez la réponse de Ceving pour cela.


11
OP a demandé de ne pas écraser les fichiers existants même s'ils sont plus anciens que les fichiers copiés , donc -une correspond pas vraiment à l'objectif.
Andrew Lott

4
Dieu, vous avez absolument raison. Je suis surpris qu'il ait fallu si longtemps à quiconque pour le remarquer.
Grim ...

Ce n'est peut-être pas ce que l'OP a demandé, mais c'est exactement ce dont j'avais besoin pour mon Uberspace (Centos 7). Merci!
Thomas Praxl

Je suis content qu'il y a six ans, j'ai pu aider :-D
Grim ...

10

Alpine linux: La réponse ci - dessous est uniquement pour le cas d'un seul fichier: en alpin cp -nne fonctionne pas (et false | cp -i ...aussi) donc la solution qui fonctionne dans mon cas que j'ai trouvée est:

if [ ! -f env.js ]; then cp env.example.js env.js; fi 

Dans l'exemple ci-dessus, si le env.jsfichier n'existe pas, nous copions env.example.jsvers env.js.


1

Certaines versions de cp n'ont pas l' option --no-clobber . Dans ce cas:

  echo n | cp -vipr src/* dst
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.