J'ai une commande qui accepte un fichier comme argument, modifie le fichier, puis l'écrit dans le nom de fichier spécifié dans le deuxième argument. J'appellerai ce programme modifyfile
.
Je voulais qu'il fonctionne "sur place", j'ai donc écrit un script shell (bash) qui le modifie en un fichier temporaire puis le recule:
TMP=`mktemp`
modifyfile "$original" "$TMP"
mv -v "$TMP" "$original"
Cela a pour effet secondaire malheureux de détruire les autorisations sur ce fichier. Le fichier est recréé avec les autorisations par défaut.
Existe-t-il un moyen de dire à la mv
commande d'écraser la destination sans modifier ses autorisations? Ou existe-t-il un moyen de sauvegarder l'utilisateur, le groupe et les autorisations de l'original et de les restaurer?
la source
rm "$TMP"
aussi le faire aussi, mais il semble faire exactement ce que je veux.mv
place. Je ne vois pas de moyen de résoudre ce problème.chown
fonctionne uniquement en tant que root.chmod
etchgrp
peut ou peut ne pas fonctionner selon les autorisations de l'utilisateur. Ni l'un ni l'autre ne copie d'autres attributs tels que l'ACL ou les attributs étendus spécifiques au système de fichiers.Il existe deux stratégies pour remplacer un fichier par une nouvelle version:
Créez un fichier temporaire avec la nouvelle version, puis déplacez-le en place.
Remplacez l'ancien fichier en place.
Si vous le pouvez, utilisez la méthode 1, mais répliquez d'abord les attributs du fichier d'origine avec
cp -p --attributes-only
. Cela nécessite des coreutils GNU (c'est-à-dire Linux non intégré ou des environnements suffisamment similaires à Linux). Si cecp
n'est pas le cas--attributes-only
, omettez cette option: cela fonctionnera mais cela répliquera également les données.Si vous ne pouvez pas répliquer les attributs du fichier existant, par exemple parce que vous disposez d'autorisations d'écriture sur celui-ci mais ne le possédez pas et que vous souhaitez conserver le propriétaire, alors seule la méthode 2 est possible. Pour minimiser le risque de perte de données:
la source
cp -p --attributes-only "$original" "$tmp"
n'utilisera pas de ressources pour copier le contenu du fichier. Je n'ai pas pu trouver de quelle version cet argument a été ajouté.cp
implémentations.Après notre discussion sur la première réponse, je propose une réponse différente:
Remarques:
$original
dans lemktemp
modèle pour m'assurer que le fichier temporaire n'est pas placé dans/tmp
mais dans le même dossier que$original
. Je crois que si/tmp
est monté sur un système de fichiers différent, l'opération ne serait plus atomique.mktemp
est maintenant cité au cas où il contiendrait un espace.$()
au lieu de `` car je le considère plus propre.ch{mod,own} --reference
sont utilisés pour transférer les autorisations de$original
à$TMP
. Si quelqu'un a des idées supplémentaires sur les métadonnées qui peuvent et doivent être transférées, veuillez modifier mon message et l'ajouter.la source