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?
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
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.
cp -n
Est ce que tu veux. Voir la page de manuel.
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.
Cela fonctionnera sur RedHat:
false | cp -i source destination 2>/dev/null
Mise à jour et ne pas écraser est quelque chose de différent.
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
.
Certaines versions de cp n'ont pas l'option - no-clobber. Dans ce cas:
echo n | cp -vipr src/* dst