Wie kann ich einen Ordner gleichzeitig verschieben und neu erstellen?

Wie kann ich einen Ordner gleichzeitig verschieben und neu erstellen?

Ich habe einen Ordner statisticsauf einem Ubuntu-Server, in dem regelmäßig Datendateien gespeichert werden. Wie kann ich statisticsden Ordner umbenennen, backup-xxwährend ich ihn neu erstelle, statisticsdamit er zum Speichern neuer Dateien verfügbar ist?

Die Dateien im statisticsOrdner 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 statisticses 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 mvauf dem symbolischen Link noch ein Plain-Befehl ln -sdies tun: Sie würden einen Eintrag im Zielverzeichnis erstellen. GNU coreutils ln -snfist 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 statisticsVerzeichnis in umbenannt backup-xx. Wenn dies erfolgreich ist, wird mit der Erstellung eines neuen statisticsVerzeichnisses fortgefahren.

Für eine atomarere Operation können Sie ein Verzeichnis statistics-001(oder etwas Ähnliches, vielleicht durch Ersetzen 001durch 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 statisticsVerknü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 statisticsVerzeichnis 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, statisticsauf 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 mvgenauso lange dauern wird , cpegal 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/.

verwandte Informationen