
Ich habe einen Ordner statistics
auf einem Ubuntu-Server, in dem regelmäßig Datendateien gespeichert werden. Wie kann ich statistics
den Ordner umbenennen, backup-xx
während ich ihn neu erstelle, statistics
damit er zum Speichern neuer Dateien verfügbar ist?
Die Dateien im statistics
Ordner werden von PHP erstellt file_put_contents
.
Ich bevorzuge die Umbenennung des Ordners, da sich darin viele Dateien befinden statistics
.
Antwort1
Es gibt keine Möglichkeit,atomarErsetzen Sie ein Verzeichnis durch ein anderes. Sie können das alte Verzeichnis verschieben und dann ein neues Verzeichnis erstellen:
mv statistics backup-xx
mkdir statistics
Dadurch bleibt jedoch ein kleines Zeitfenster, in dem statistics
es nicht existiert. Dies ist ein Problem, wenn ein Prozess jederzeit Dateien im Verzeichnis ablegen kann.
Um ein Verzeichnis effektiv und atomar zu ersetzen, müssen Sie symbolische Links verwenden. Erstellen Sie ein Verzeichnis, dessen Name den Zeitraum vom Anfang an enthält:
mkdir "statistics-$(date +%Y%m%d)"
(oder wie auch immer Sie die Verzeichnisbenennungskonvention wählen möchten). Erstellen Sie einen symbolischen Link mit einem festen Namen zum aktuellen Speicherort:
ln -s … statistics
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 ein Plain-Befehl mv
auf dem symbolischen Link noch ein Plain-Befehl ln -s
dies tun: Sie würden einen Eintrag im Zielverzeichnis erstellen. GNU coreutils ln -snf
ist auch nicht geeignet, da es den vorhandenen symbolischen Link entfernt, bevor ein neuer erstellt wird, was ein kleines Zeitfenster hinterlässt, in dem der Pfad nicht existiert. Sie können GNU coreutils auf dem neuen symbolischen Link verwenden mv -T
.
new_dir="statistics-$(date +%Y%m%d)"
mkdir "$new_dir"
ln -s statistics.new
mv -Tf statistics.new statistics
Antwort2
mv statistics backup-xx && mkdir statistics
Dadurch wird das vorhandene statistics
Verzeichnis in umbenannt backup-xx
. Wenn dies erfolgreich ist, wird mit der Erstellung eines neuen statistics
Verzeichnisses fortgefahren.
Für eine atomarere Operation können Sie ein Verzeichnis statistics-001
(oder etwas Ähnliches, vielleicht durch Ersetzen 001
durch das heutige Datum in einem geeigneten Format) und einen symbolischen Link darauf mit dem Namen erstellen statistics
:
mkdir statistics-001
ln -s statistics-001 statistics
Wenn Sie dies „rotieren“ möchten, sodass neue Daten in ein sauberes Verzeichnis gelangen, erstellen Sie zuerst das Verzeichnis und erstellen Sie dann die statistics
Verknüpfung dazu neu:
mkdir statistics-002
ln -sf statistics-002 statistics
mv statistics-001 backup-001
Auf diese Weise kann jedes Programm, das in das statistics
Verzeichnis schreibt (also das Verzeichnis, auf das dieser symbolische Link verweist), es immer finden .
Wenn Sie besondere Berechtigungen oder Eigentumsrechte für das Verzeichnis benötigen, statistics
auf das verwiesen wird, legen Sie diese fest, bevor Sie den Link (neu) erstellen.
1 Oder besser gesagt, die Zeit, die ein ProgrammohneEin gültiges Zielverzeichnis wird mithilfe von Standard-Unix-Tools so weit wie praktisch möglich minimiert.
Antwort3
Benennen Sie das Verzeichnis überhaupt nicht um. Sie sagten, dass Sie das Verzeichnis lieber umbenennen würden, weil es viele Dateien enthält. Der einzige Grund, der mir einfällt, warum Sie das möchten, ist, dass das Kopieren der Dateien zu lange dauern würde. Allerdingsziehen um(d. h. das Umbenennen) der Dateien erfolgt sofort, solange sie an einen Speicherort im selben Dateisystem verschoben werden. Ich gehe davon aus, dass Sie dies tun möchten, da das Ändern von Dateisystemen mv
genauso lange dauern wird , cp
egal ob Sie ein Verzeichnis oder dessen Inhalt verschieben.
Also, tun Sie einfach:
mkdir backup-xx && mv statistics/* backup-xx
Wenn Sie auch auf versteckte Dateien zugreifen müssen, haben Sie folgende Möglichkeiten:
mkdir backup-xx && mv statistics/* statistics/.* backup-xx
Oder bei Verwendung von bash
:
shopt -s dotglob; mkdir backup-xx && mv statistics/* statistics/.* backup-xx
Auf diese Weise ist das Verzeichnis immer vorhanden, Sie verschieben seinen Inhalt jedoch trotzdem in einem einfachen und schnellen Vorgang.
Antwort4
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 weiteren Befehl ausführen, um die Verzeichnisberechtigungen zu ändern.
mkdir -p <path>/backup-xxx
mv statistics/* <path>/backup-xxx/.