Tar zwingen, Fehler beim Komprimieren von Dateien zu ignorieren / zu überspringen?

7

Nehmen wir an, ich mache das tar cfzp home.tar.gz /home(dauert eine Weile) und eine Datei ändert sich während der Komprimierung und tar schlägt fehl. Ich bekomme "Datei geändert, während wir sie lesen" und tar stoppt. Ich gehe davon aus, dass home.tar.gz jetzt unvollständig ist, oder war das nur der "Hinweis" und nicht wirklich ein Fehler?

Gibt es eine Art "Force" -Option, mit der Teer seine Arbeit beendet und Fehler nicht abgebrochen werden?

Bearbeiten / Aktualisieren: Ich habe festgestellt, dass "--ignore-failed-read bei unlesbaren Dateien nicht ungleich Null beendet wird", und zumindest denke ich, dass es funktioniert. Sie müssen jedoch mit der Reihenfolge der Parameter vorsichtig sein, da Sie möglicherweise eine TAR-Datei mit dem Namen "--ignore-failed-read" erhalten.

Muss ich noch etwas ignorieren?

Update: Ohne "--ignore-failed-read" wird tar fortgesetzt, wenn eine Datei entfernt wurde. "Datei entfernt, bevor wir sie lesen". Ich denke jedoch, dass der Fehler "Datei beim Lesen geändert" möglicherweise abgebrochen wird, aber ich weiß es nicht wirklich. Es ist schwierig, das Archiv mit dem "Original" zu vergleichen, da ich Cache-Dateien habe, die kommen und gehen usw.

Update: Bei näherer Betrachtung ist "Datei geändert, während wir sie lesen" eher ein Hinweis. Es sieht so aus, als würde tar weiterarbeiten, wenn sich Dateien ändern, während tar sein Geschäft betreibt. Aber ich lasse die Antwort offen, vielleicht kann jemand mit mehr Erfahrung mehr Einsicht hinzufügen.

PJ Brunet
quelle
Was ist die Fehlermeldung, die Sie erhalten, wenn tar ausfällt?
user9517
Welche Zeit? Wenn die Komprimierung fehlschlägt oder wenn das Lesen von --ignore-failed-fehlschlägt?
PJ Brunet
Alle sind sicherlich relevant.
user9517
Was bekommen Sie in stderror, wenn Sie "tar cfzp home.tar.gz --ignore-failed-read / home" ausführen?
Danila Ladner
Ich habe den Fehler nicht gespeichert, es war so etwas wie "Datei während der Komprimierung geändert ... Abbruch". Tatsächlich scheint "tar cfzp home.tar.gz --ignore-failed-read / home" jetzt zu funktionieren, daher bin ich mir nicht sicher, woher der Fehler (Datei nicht gefunden) stammt: - / Ich habe die Frage bearbeitet, um sie zu klären meine Verwechslung mit --ignore-failed-read
PJ Brunet

Antworten:

6

Ihre Annahme ist richtig. "Datei geändert, während wir sie lesen" ist ein Hinweis, der sich normalerweise auf verwendete Dateien bezieht (dh während des Erstellungsprozesses geschrieben wurde), während tar das Archiv erstellt. Wenn Konsistenz von entscheidender Bedeutung ist, sollten Sie den Inhalt besser an anderer Stelle synchronisieren, z

rsync -avz /my/home/ /somebackupdir/my/home/  # initial sync, followed by 
rsync -avz /my/home/ /somebackupdir/my/home/  # any subsequent sync, repeated
                                              # as often as you feel necessary

Dies bietet Ihnen den Vorteil, dass Sie über einen Sicherungsspeicherort verfügen, an dem nur die Diffs aktualisiert werden müssen, bevor der Tarball erstellt wird.

Stephan
quelle
Sie haben die einzige Antwort in 3 Jahren und es ist eine beliebte Frage, daher markiere ich dies als akzeptierte Antwort. Auch wenn ich rsync nicht so verwenden würde, ist es eine interessante Antwort ;-)
PJ Brunet
1

Ich denke, die richtige Antwort auf Ihre Frage sollte lauten:

Verwenden Sie tar --warning=no-file-changeddiese Option, um nur Warnungen zu unterdrücken "%s: file changed as we read it". Ein General --ignore-failed-readkann Fehler ignorieren, die Sie lieber nicht ignorieren möchten.

chwa
quelle
1

So komprimieren Sie mehrere Dateien, während Sie fehlende Dateien überspringen :

# This file exists:
> existing_file 

# This file is missing:
rm -f deleted_file 

# Compress but don't fail if deleted_file is missing:
tar -cvzf archive.tar.gz $(ls deleted_file existing_file 2>/dev/null)
echo $? # exit code is 0

# List archive content:
tar tvf archive.tar.gz

  -rw-rw-r-- nmanos/nmanos     0 2020-05-06 10:00 existing_file
Noam Manos
quelle