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?
386
Réponses:
Tiré de la page de manuel :
Exemple:
la source
cp -n source.txt destination.txt || true
cp -n
ne se ferme pas avec une erreur si le fichier existe sur Ubuntu 12.04.Pensez à utiliser
rsync
.Selon les commentaires
rsync -a -v src dst
n'est pas correct car il mettra à jour les fichiers existants.la source
--ignore-existing
indicateur pour empêcher l'écrasement des fichiers existants.rsync -a -v --ignore-existing <src> <dst>
est en effet la bonne réponse, au lieu decp -u
ci - dessus.C'est ce que tu veux. Voir la page de manuel.
la source
Cela fonctionnera sur RedHat:
La mise à jour et non l'écrasement est quelque chose de différent.
la source
false
-on ici?-i
questions.Pour les personnes qui n'ont pas d'option 'n' (comme moi sur RedHat), vous pouvez utiliser
cp -u
pour é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.
la source
-u
ne correspond pas vraiment à l'objectif.Alpine linux: La réponse ci - dessous est uniquement pour le cas d'un seul fichier: en alpin
cp -n
ne fonctionne pas (etfalse | cp -i ...
aussi) donc la solution qui fonctionne dans mon cas que j'ai trouvée est:Dans l'exemple ci-dessus, si le
env.js
fichier n'existe pas, nous copionsenv.example.js
versenv.js
.la source
Certaines versions de cp n'ont pas l' option --no-clobber . Dans ce cas:
la source