web-dev-qa-db-fra.com

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 script Crontab Bash. Des idées?

326
mnowotka

Extrait 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
501
hovanessyan

Pensez à 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.

75
Hans Ginzel
cp -n

Est ce que tu veux. Voir la page de manuel.

48
bucko

Pour ceux qui trouvent que ceux-ci 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 la source existante (ou s’il n’existe pas de source existante). un).

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

32
Grim...

Cela fonctionnera sur RedHat:

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

Mise à jour et ne pas écraser est quelque chose de différent.

30
ceving

Alpine Linux: La réponse ci-dessous concerne uniquement les cas de fichier unique: dans Alpine cp -n ne fonctionne pas (et false | cp -i ... également), la solution qui fonctionne dans mon cas est la suivante:

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

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

8

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

  echo n | cp -vipr src/* dst
0
Octavian