tar: So entfernen Sie Dateien nach dem Packen, behalten aber das Verzeichnis

tar: So entfernen Sie Dateien nach dem Packen, behalten aber das Verzeichnis

Ich möchte, dass Tar ein komplettes Verzeichnis packt

tar cvjf dir.tbz dir

Aber lass es alle Dateien löschen

tar cvjf dir.tbz dir --remove-files

Allerdings wird dadurch auch ./dir entfernt. Ich habe also versucht, vor dem Packen per cd in das Verzeichnis zu wechseln.

tar cvjf dir.tbz --remove-files -C dir .

Das entfernt aber trotzdem ./dir... was für mich keinen Sinn macht, denn warum sollte Tar das Arbeitsverzeichnis selbst löschen? Kann ich nicht ein komplettes Verzeichnis packen und die Dateien nach dem Packen entfernen, ohne das ganze Verzeichnis zu löschen?

Ich habe einen laufenden Prozess, der ständig Dateien in ./dir erstellt, und möchte alle Dateien stündlich packen und dann die gepackten Dateien entfernen. Ich könnte mkdir nach tar und delete ausführen, aber das könnte dazu führen, dass der andere Prozess, der Dateien erstellt, Probleme hat, wenn er versucht, eine neue Datei zu schreiben, bevor mkdir das Verzeichnis neu erstellt hat.

Antwort1

Sie könnten so etwas versuchen:

find dir -type f -mmin +1 | xargs -I{} sh -c 'tar rvf dir.tar {} && rm {}'
bzip2 dir.tar && mv dir.tar.bz2 dir-$(date +%F-%T).tbz

Es ist etwas komplizierter als Ihr aktueller Befehl, funktioniert aber und ich glaube nicht, dass es irgendwelche Race-Probleme gibt (vorausgesetzt, in eine Datei wird nicht mehrmals mit Abständen von mehr als einer Minute geschrieben).

Der findBefehl findet alle Dateien in dir, die mindestens eine Minute alt sind (also derzeit nicht beschrieben werden). Diese Liste wird dann an weitergeleitet xargs, das die einzelnen Dateien nacheinander zur dir.tarDatei hinzufügt. Sobald die Datei erfolgreich zur Tar-Datei hinzugefügt wurde, wird das Original entfernt. Indem Sie dies einzeln tun, vermeiden Sie Probleme mit zu langen Befehlszeilen, wenn Sie eine große Anzahl von Dateien haben. Abschließend können Sie die Tar-Datei komprimieren und umbenennen.

Antwort2

Mein Workaround hierfür wäre nun folgender:

Ich schreibe ein Skript, das in das Verzeichnis wechselt, das Material mit ./* tarnt und dann löscht. Ich hatte nur gehofft, dass -C dasselbe tun würde, damit ich es in einer Befehlszeile haben könnte, aber das tut es nicht.

#!/bin/bash

cd /path/to/dir
tar cvjf dir.tbz ./* --remove-files

Sollte arbeiten.

verwandte Informationen