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?
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?
Réponses:
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
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
.
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.
--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 de cp -u
ci - dessus.
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.
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.
-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 (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.js
fichier n'existe pas, nous copions env.example.js
vers env.js
.