Ist es möglich, beim Erstellen eines Tar leere Verzeichnisse auszuschließen?

Ist es möglich, beim Erstellen eines Tar leere Verzeichnisse auszuschließen?

Ich habe einen Backup-Befehl, der so aussieht:

tar cvpzf /backup/incremental-$now.tar.gz --after-date='1 day ago' -C / etc/ home/ root/  --exclude-from=/root/exclusion_list.txt --warning=no-file-unchanged > /backup/log-$now.txt 2>&1

Das Problem ist, dass auch leere Ordner eingeschlossen werden, wenn alle darin enthaltenen Dateien unverändert sind und daher nicht in die inkrementelle Sicherung einbezogen werden. Ich suche nach einer Möglichkeit, dies zu vermeiden, aber die einzigen Lösungen, die ich gefunden habe (Weiterleiten der Ergebnisse von find als Argumente mit xargs an tar), funktionieren nur, wenn Sie einen Ordner haben, ich habe drei davon.

Antwort1

Standardmäßig bietet Tar keine Möglichkeit, leere Verzeichnisse zu überspringen. Allerdings ist es nicht allzu viel Arbeit, aus dem Nichts ein einfaches Shell-Skript zu erstellen, um das zu tun, was getan werden muss.

Hierist eine Forumsdiskussion, in der ich bei Bedarf die Lösung für genau das gleiche Problem gefunden habe.

WICHTIGES UPDATE: Zuerst muss ich mich ernsthaft für mein schlampiges Kopieren und Einfügen entschuldigen. Es war ein Post spät in der Nacht und ich war nicht auf dem Höhepunkt meiner Intelligenz ...

Der richtige Forumsbeitrag lautetHier. Tatsächlich ist es dieselbe Person, die dieselbe Frage in einem anderen Forum stellt und eine völlig andere Antwort erhält. Ich hatte beide mit einem Lesezeichen versehen, als ich auf das Problem stieß, und den Link zum falschen Forum angegeben.

Tatsächlich wird hier gezeigt, wie die Ausgabe des Find-Befehls in Tar „umgeleitet“ wird. Sie müssen den ganzen Kram über „neuer als“, nach dem der Typ fragt, ignorieren.

Stattdessen sieht der Suchteil, den Sie benötigen, folgendermaßen aus:

find . -type d ! -empty | ...

Natürlich müssen Sie den Punkt (".") durch den Pfad ersetzen, in dem find/tar starten soll. Fahren Sie nach dem Pipe-Zeichen mit dem Tar-Befehl gemäß dem zweiten (richtigen) Link fort.

Es tut mir noch einmal zutiefst leid, wenn ich durch meine mangelnde Liebe zum Detail Ärger verursacht habe.

Antwort2

Eine andere Möglichkeit, die nur funktioniert, wenn Sie nur eine kleine Anzahl von Dateien geändert haben, ist:

tar cvzf [...] `find . -mtime -1 -type f`

Wenn Sie über eine große Menge an Änderungen verfügen, können Sie die Liste der geänderten Dateien in eine Datei schreiben und den Parameter --files-from in Ihrem Tar-Befehl verwenden:

find . -mtime -1 -type f > /tmp/changed.txt
tar cvzf [...] --files-from=/tmp/changed.txt

oder in einer Zeile

find . -mtime -1 -type f | tar cvzf [...] --files-from=/dev/stdin

verwandte Informationen