Ich habe einen Ordner statistics
auf einem Ubuntu-Server, in dem regelmäßig Datendateien gespeichert werden. Wie kann ich einen statistics
Ordner umbenennen , backup-xx
während ich einen Ordner neu erstelle statistics
, um neue Dateien zu speichern?
Die Dateien im statistics
Ordner werden von PHP erstellt file_put_contents
.
Ich bevorzuge das Umbenennen des Ordners, da sich viele Dateien im statistics
Ordner befinden.
bash
shell-script
files
rename
Googlebot
quelle
quelle
Antworten:
Dies würde das vorhandene
statistics
Verzeichnis in umbenennenbackup-xx
, und wenn dies erfolgreich ist, würde es fortfahren, ein neuesstatistics
Verzeichnis zu erstellen .Für eine atomarere Operation sollten Sie ein Verzeichnis
statistics-001
(oder ein ähnliches Verzeichnis , möglicherweise durch Ersetzen durch das001
heutige Datum in einem geeigneten Format) und einen symbolischen Link mit dem Namen erstellenstatistics
:Wenn Sie dies "drehen" möchten, damit neue Daten in ein sauberes Verzeichnis gelangen, erstellen Sie zuerst das Verzeichnis und erstellen Sie dann den
statistics
Link dazu neu:Auf diese Weise kann jedes Programm Schreiben in das
statistics
Verzeichnis (dh das Verzeichnis , dass dieser symbolische Link verweist) wird nie 1 scheitern , es zu finden.Wenn Sie spezielle Berechtigungen oder Eigentumsrechte für das Verzeichnis benötigen, auf das
statistics
verwiesen wird, legen Sie diese fest, bevor Sie den Link (neu) erstellen.1 Oder besser gesagt, auf diese Weise wird die Zeit, die ein Programm ohne ein gültiges Zielverzeichnis hätte, mit Standard-Unix-Tools so weit wie möglich minimiert.
quelle
chown --reference=backup-xx statistics ; chmod --reference=backup-xx statistics
Eigentümer und Berechtigungen festlegen. Idealerweise würden Sie dies vor dem Umbenennen tun, also einen Typprozessmkdir new ; chown ; chmod ; mv stats backup ; mv new stats
.ln -sf
ist nicht atomar. Es ist festgelegt, die Verknüpfung des alten Symlinks aufzuheben und dann einen neuen zu erstellen, der notwendigerweise nicht atomar ist. Stattdessen müssen Sie einen zusätzlichen temporären Symlink erstellen und dierename
Funktion (mv
z. B. über den Befehl) verwenden, um die alte atomar zu ersetzen. Siehe meine Herangehensweise hier: git.musl-libc.org/cgit/musl/tree/tools/…Es gibt keine Möglichkeit, ein Verzeichnis atomar durch ein anderes Verzeichnis zu ersetzen. Sie können das alte Verzeichnis verschieben und dann ein neues Verzeichnis erstellen:
Dies lässt jedoch ein kleines Zeitfenster übrig, in dem
statistics
es kein existiert. Dies ist ein Problem, wenn ein Prozess jederzeit Dateien im Verzeichnis ablegen kann.Um ein Verzeichnis effektiv atomar zu ersetzen, müssen Sie symbolische Links verwenden. Erstellen Sie ein Verzeichnis, dessen Name den Zeitraum von Anfang an enthält:
(oder wie auch immer Sie die Verzeichnisnamenskonvention wählen möchten). Erstellen Sie eine symbolische Verknüpfung mit einem festen Namen zum aktuellen Speicherort:
Um das Verzeichnis zu ersetzen, erstellen Sie zuerst ein neues Verzeichnis und einen neuen symbolischen Link und verschieben Sie es dann, um den alten symbolischen Link zu überschreiben. Beachten Sie, dass weder eine Ebene
mv
auf dem symbolischen Link noch eine Ebene diesln -s
tun: Sie würden einen Eintrag im Zielverzeichnis erstellen. GNU coreutilsln -snf
ist auch nicht geeignet, da der vorhandene Symlink entfernt wird, bevor ein neuer erstellt wird. Dadurch bleibt ein kleines Zeitfenster, in dem der Pfad nicht vorhanden ist. Sie können GNU-Coreutilsmv -T
für den neuen symbolischen Link verwenden.quelle
busybox
'ln -sf
ist auch nicht atomar, ich kenne keine Implementierung, die ist.openat()
oder CWD). Ich würde nur den Inhalt des Verzeichnisses in ein neues verschieben. Das ist in Bezug auf geöffnete Dateien immer noch unsicher, aber ein bisschen besser. Im Zweifelsfall verwenden,logrotate
welche solche Probleme am besten respektieren sollten.symlink
Systemaufruf überschreibt keine vorhandene Datei, daher ist es leider unmöglich, eine symbolische Verknüpfung atomar direkt zu wechseln. Derrename
Systemaufruf überschreibt eine vorhandene Datei, aber ärgerlicherweise gibt es keine tragbare Möglichkeit, dies in der Shell zu tun. Dank der-T
Option ist dies mit GNU-Coreutils möglich .Benennen Sie das Verzeichnis überhaupt nicht um. Sie sagten, dass Sie es vorziehen, das Verzeichnis umzubenennen, da es viele Dateien enthält. Der einzige Grund, warum ich mir vorstellen kann, dass Sie dies möchten, ist, dass das Kopieren der Dateien zu lange dauern würde. Das Verschieben (dh Umbenennen) der Dateien erfolgt jedoch sofort, solange sie an einen Speicherort im selben Dateisystem verschoben werden. Ich gehe davon aus, dass Sie dies tun müssen, da das Ändern von Dateisystemen
mv
genauso viel Zeit incp
Anspruch nimmt, unabhängig davon, ob ein Verzeichnis oder dessen Inhalt verschoben wird.Also einfach machen:
Wenn Sie auch versteckte Dateien benötigen, können Sie Folgendes tun:
Oder wenn Sie verwenden
bash
:Auf diese Weise ist das Verzeichnis immer vorhanden, aber Sie können den Inhalt dennoch einfach und schnell verschieben.
quelle
Sie können den Inhalt des Statistikordners in ein neu erstelltes Verzeichnis verschieben, anstatt den Ordner selbst zu verschieben. Wenn Sie den gesamten Ordner verschieben, müssen Sie einen anderen Befehl ausführen, um die Verzeichnisberechtigungen zu ändern.
quelle