462 votes

Linux : comment copier mais pas écraser ?

Je veux cp un répertoire mais je ne veux pas écraser les fichiers existants même s'ils sont plus anciens que les fichiers copiés. Et je veux le faire complètement non interactif car cela fera partie d'un Crontab Bash script. Des idées ?

1 votes

710voto

hovanessyan Points 8800

Tiré du page de manuel :

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

Exemple :

cp -n myoldfile.txt mycopiedfile.txt

48 votes

Notez que cette opération se terminera par une erreur si le fichier existe. Pour sortir avec succès, essayez cp -n source.txt destination.txt || true

23 votes

@galenandrew cp -n ne se termine pas par une erreur si le fichier existe sur Ubuntu 12.04.

0 votes

@galenandrew Confirmé. Merci. Mon projet ne se construisait pas dans Xcode après avoir ajouté une exécution script à ma cible.

125voto

Hans Ginzel Points 24

Envisagez d'utiliser rsync .

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

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

9 votes

Vous voulez ajouter le --ignore-existing pour éviter que les fichiers existants ne soient écrasés.

8 votes

Commande complète rsync -a -v --ignore-existing <src> <dst> est en effet la bonne réponse, au lieu de cp -u ci-dessus.

1 votes

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 le recopiera pas... mais rsync, avec --ignore-existing ? Probablement pas non plus... donc ça les rend parfaitement équivalents, non ?

55voto

ShoeDah7 Points 346
cp -n

C'est ce que vous voulez. Voir la page de manuel.

20 votes

"Voir la page de manuel" n'est pas une réponse acceptable, veuillez fournir des liens vers la documentation ou des citations.

0 votes

La page de manuel : -n Do not overwrite an existing file. (The -n option overrides any previous -f or -i options.)

38voto

Grim... Points 5973

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

[Comme mentionné dans les commentaires, cela va écraser les anciens fichiers, ce n'est donc pas exactement ce que le PO voulait. Utilisez la réponse de Ceving pour cela.

13 votes

Le PO a demandé de ne pas écraser les fichiers existants même s'ils sont plus anciens que les fichiers copiés donc -u ne correspond pas vraiment à l'objectif.

5 votes

Mon Dieu, vous avez tout à fait raison. Je suis surpris que ça ait pris si longtemps pour que quelqu'un le remarque.

0 votes

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 !

36voto

ceving Points 3990

Cela fonctionnera sur RedHat :

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

Mise à jour de y pas d'écrasement est quelque chose de différent.

6 votes

Qu'est-ce que false faire ici ?

12 votes

@FrozenFlame Answers -i questions.

1 votes

Evidemment, cette commande ne fonctionnera pas si vous essayez de copier plus de fichiers que ARG_MAX. Pour contourner ce cas, vérifiez ceci lien .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X