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 find
Befehl 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.tar
Datei 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.