Ich habe einen Befehl, der eine Datei als Argument akzeptiert, die Datei ändert und sie dann in den im zweiten Argument angegebenen Dateinamen schreibt. Ich werde das Programm aufrufen modifyfile
.
Ich wollte, dass es "an Ort und Stelle" funktioniert, also schrieb ich ein Shell-Skript (Bash), das es in eine temporäre Datei ändert und es dann zurück verschiebt:
TMP=`mktemp`
modifyfile "$original" "$TMP"
mv -v "$TMP" "$original"
Dies hat den unglücklichen Nebeneffekt, dass die Berechtigungen für diese Datei zerstört werden. Die Datei wird mit Standardberechtigungen neu erstellt.
Gibt es eine Möglichkeit, den mv
Befehl anzuweisen, das Ziel zu überschreiben, ohne seine Berechtigungen zu ändern? Oder gibt es alternativ eine Möglichkeit, Benutzer, Gruppen und Berechtigungen aus dem Original zu speichern und wiederherzustellen?
quelle
rm "$TMP"
auch, aber es scheint genau das zu tun, was ich will.mv
stattdessen verwenden würden. Ich sehe keinen Weg, um dieses Problem zu lösen.chown
funktioniert nur als root.chmod
undchgrp
kann abhängig von den Berechtigungen des Benutzers funktionieren oder nicht. Weder kopiert andere Attribute wie ACL oder dateisystemspezifische erweiterte Attribute.Es gibt zwei Strategien, um eine Datei durch eine neue Version zu ersetzen:
Erstellen Sie eine temporäre Datei mit der neuen Version und verschieben Sie sie.
Überschreiben Sie die alte Datei.
Wenn Sie können, verwenden Sie Methode 1, replizieren Sie jedoch zuerst die Attribute der Originaldatei mit
cp -p --attributes-only
. Dies erfordert GNU-Coreutils (dh nicht eingebettetes Linux oder ausreichend Linux-ähnliche Umgebungen). Wenncp
dies nicht der Fall ist--attributes-only
, lassen Sie diese Option aus: Es funktioniert, aber es werden auch die Daten repliziert.Wenn Sie die Attribute der vorhandenen Datei nicht replizieren können, z. B. weil Sie über Schreibberechtigungen verfügen, diese aber nicht besitzen und den Eigentümer beibehalten möchten, ist nur Methode 2 möglich. So minimieren Sie das Risiko eines Datenverlusts:
quelle
cp -p --attributes-only "$original" "$tmp"
werden keine Ressourcen zum Kopieren des Inhalts der Datei verwendet. Ich konnte nicht finden, ab welcher Version dieses Argument hinzugefügt wurde.cp
Implementierungen gibt es so etwas noch nicht .Nach unserer Diskussion über die erste Antwort schlage ich eine andere Antwort vor:
Bemerkungen:
$original
in dermktemp
Vorlage, um sicherzustellen, dass die temporäre Datei nicht in,/tmp
sondern im selben Ordner wie abgelegt wird$original
. Ich glaube, wenn/tmp
es auf einem anderen Dateisystem gemountet ist, wäre die Operation nicht mehr atomar.mktemp
wird jetzt angegeben, falls es Leerzeichen enthält.$()
anstelle von "", weil ich es für sauberer halte.ch{mod,own} --reference
werden verwendet, um die Berechtigungen von an$original
zu übertragen$TMP
. Wenn jemand zusätzliche Ideen hat, welche Metadaten übertragen werden können und sollen, dann bearbeite bitte meinen Beitrag und füge ihn hinzu.quelle