Bash unrar, unzip: Auspackfehler in eine Datei loggen

WulfmanGER

Commander
Registriert
Juli 2005
Beiträge
2.267
Hallo zusammen,

ich hab oftmals die Situation das ich 10+ RARs/ZIPs auspacken muss. Jetzt passiert es hin und wieder das im Archiv eine Datei nicht vollständig entpackt werden kann (es handelt sich um Bilder; es kommt beim Entpacken ein CRC und im Ergebnis sieht das Bild dann "abgeschnitten" aus). Wenn ich das "händisch" angehe ist das alles kein Problem. Kommt ein Fehler .... sortiere ich das Archiv aus und guck mir den Fehler näher an. Bei mehreren Files gibt mir 7z (nutze ich noch in der Windows-Version des Scripts, die WSL/Linux-Version kann 7z nicht nutzen ... gibt leider keine Weiterentwicklung und die aktuellste Version hat einen Bug mit bestimmten Zeichensatz-Konstellationen; zudem bekomme ich gerade immer mehr RAR5-Archive - die kann 7z nicht) zwar am Ende eine Fehlermeldung (in irgendeinem der 30 Archive war jetzt ein CRC-Fehler ... TOLL), aber so richtig Glücklich macht mich das nicht. Unrar ist da nicht besser ... Unzip kann ich leider mangels fehlerhaften Archiven nichts zu sagen.

Ich suche nun eine Möglichkeit eben diese Fehlermeldung in eine Datei auszulagern - inkl. des betroffenen Archivnamens.

Meine Versuche waren bisher nicht so erfolgreich (gerade erst mit Linux-Bash angefangen ...)

So sieht mein Script (Auszug) bisher aus:

Code:
for i in *
do
        checkFile=$(file "$i")
        [ -d "${i%.*}" ] && echo ""$i": Verzeichnis bereits vorhanden (skip)" >> error.txt; continue    
        if [[ "${checkFile,,}" =~ "zip" ]]
        then
                unzip -j -O WIN "$i" -d "${i%.*}"
        elif [[ "${checkFile,,}" =~ "rar" ]]
        then
                unrar e -ad "$i"
        fi
done
Erstmal prüfen ob ich ggf. schon mal ausgepackt habe -> Skip mit continue.
Ich prüfe ob die Datei ein ZIP oder RAR ist. Der Entpackbefehl sorgt dafür das ich die Verzeichnisstruktur im Archiv nicht übernehme und in einen Ordner mit dem Namen des Archivs (ohne Endung) entpacke.

Das klappt bisher (ich befürchte da kommen noch Fehler - aber meine Archive sind "begrenzt" ;) sauber. Jetzt fehlt halt die Fehlererkennung.

RAR bringt mir z.b. sowas:
047.jpg - checksum error
bzw. als Zusammenfassung:
Total errors: 1

Ich möchte nicht das das Entpacken gestoppt wird (manchmal kommen auch Fehlermeldungen obwohl alles sauber ausgepackt werden konnte). Nur am Ende in einer "error.txt" => "Error: balbal.rar" - das prüfe ich dann händisch.

Mit unrar e -ad -idq "$i" 2>> error.txt bekomme ich zwar nur den Fehler in die error.txt - aber bei welchen Archiv ... zudem müllt es die Datei zu wenn mehr Fehler enthalten sind (ich muss/will nur über einen Informiert werden). Daher wohl am besten ich lese irgendwie "Total Errors" aus ... wenn es existiert -> error.txt mit Archivnamen.

Mit unzip kann ich leider mangels defekten ZIPs nicht rumspielen. Wenn jemand ne idee hat wie ich ein ZIP kaputt mache ... ;)

Tja hier hänge ich also ...

Hoffe hier kann mir jemand ein wenig weiterhelfen. Ich denke mal das es am Ende gar nicht sooo schwer ist ;) Aber wie gesagt: ich hab mit BASH-Scripting gerade erst angefangen.

Grüße
 
Warum bekommst Du Archive die defekt sind?
Das waere die Stelle wo ich ansetzen wuerde.

Kaputt machen geht u.A. mit aendern innerhalb der ZIP mit Hexeditor.

BFF
 
  • Gefällt mir
Reaktionen: GaborDenes
Ich würde ne eigene error.txt für jedes Archiv machen. Bin leider nicht so fit in bash, aber sowas wie $i_error.txt meine ich.
 
BFF schrieb:
Warum bekommst Du Archive die defekt sind?

Server die irgendwo am Polarkreis stehen und teilweise nur 10-20kb/s liefern - dann bricht das ganze ab - resume und evtl. killt der resume das ganze. Hab auch öfters RARs wo im "Header" der http-header auftaucht - bisher keinen weg gefunden an das rar "dahinter" zu kommen. Neu laden.

Mugen schrieb:
Ich würde ne eigene error.txt für jedes Archiv machen. Bin leider nicht so fit in bash, aber sowas wie $i_error.txt meine ich.
dann muss ich anschließend x error.txt's prüfen ... auch nicht so toll.

madmax2010 schrieb:
Versuch mal via python -> Da kannst du deutlich einfacher Errorhandling implementieren & Prüfen ob etwas schon ausgepackt wurde.

dann muss ich am Ende Python und Bash mischen. Das Script macht noch viel mehr als nur Auspacken. Meine Freundin lernt gerade erst Python ... ich wollte ihr ein wenig Vorsprung lassen bevor ich damit anfange und ihr zeige wie das geht :p ... ne jetzt erstmal BASH scripten und dann die nächste herausforderung (solang das Home-Office noch geht, hab ich auch Zeit dafür G)

Hab aber gerade was gefunden:
echo "$?" gibt den Errorcode, vom letzten Programm was gestartet wurde, aus. Die CRCs geben hier z.b. eine 3 wieder: https://docs.oracle.com/cd/E86824_01/html/E54763/unrar-1.html .. also nur die Errorcodes abhandeln und das Ergebnis mit Dateinamen wegschreiben -> das ist easy bekomme ich hin. Könnte hier gleich mal CASE ausprobieren - bisher noch nichts mit gemacht freu. Je nach Errorcode anderer Text in der error.txt.

Jetzt muss ich gucken ob unzip sowas auch hat - wenn ja - wäre der Part des Scriptes eigentlich schon durch ;)

Unzip hat auch einen exitcode ... man muss nur wissen nach was man sucht :(
 
Wulfman_SG schrieb:
nutze ich noch in der Windows-Version des Scripts, die WSL/Linux-Version kann 7z nicht nutzen ... gibt leider keine Weiterentwicklung
Gibt doch das Packages p7zip-full?
Wulfman_SG schrieb:
zudem bekomme ich gerade immer mehr RAR5-Archive - die kann 7z nicht
RAR5 Support existiert in 7-Zip seit 15.06.
Wulfman_SG schrieb:
Ich möchte nicht das das Entpacken gestoppt wird (manchmal kommen auch Fehlermeldungen obwohl alles sauber ausgepackt werden konnte). Nur am Ende in einer "error.txt" => "Error: balbal.rar" - das prüfe ich dann händisch.
Dann arbeite ganz normal mit den üblichen Streams.
Code:
# leitet stdout um
$ unrar ... > /path/to/stdout.log

# leitet stderr um
$ unrar ... 2> /path/to/stderr.log

# leitet beide Streams in einzelne Dateien
$ unrar ... > /path/to/stdout.log 2> /path/to/stderr.log

# leitet stderr auf stdout um und schreibt beides in diese Datei
$ unrar ... > /path/to/stdout+stderr.log 2>&1
Zum Ausgeben und Loggen gibt es tee.
Code:
# stdout umleiten
$ unrar ... | tee /path/to/stdout.log

# stdout + stderr
$ unrar ... 2>&1 | tee /path/to/stdout+stderr.log
Wenn du beides getrennt haben willst, musst du mit Process Substitution arbeiten.
Code:
$ unrar ... > >(tee /path/to/stdout.log) 2> >(tee /path/to/stderr.log >&2)
Weiterhin solltest du die Exit Codes prüfen.
Code:
$ unrar ... && echo "Kein Fehler" || echo "Fehler"

# alternativ mehrere Commands
$ unrar ... && { echo "Kein Fehler"; do_something; something_else; } || { echo "Fehler"; do_something; do_something_else; }

# oder halt mit if für bessere Lesbarkeit arbeiten
Keine Ahnung was unrar so loggt oder an Fehlercodes zurückgibt.

Mal ganz blöd ins Blaue geraten:
Code:
$ unrar ... 2> >(tee /path/to/stderr.log >&2) || { echo "Datei $i hat einen Fehler"; cp /path/to/stderr.log "$i.error.log"; }
 
Yuuri schrieb:
Gibt doch das Packages p7zip-full?

RAR5 Support existiert in 7-Zip seit 15.06.
achso falsch ausgedrückt. Mein aktuelles Script läuft unter Windows - das was ich gerade schreibe unter WSL/Linux - hier hab ich p7zip-full natürlich installiert. Aber für Linux gibt es nur 16.02 und die hat halt dieses Problem mit Umlauten. Unzip ist das egal - ich setze WIN und er entpackt mir die sauber. Bei 7z gibt es auch entsprechenden Parameter - der macht es aber nur schlimmer. 7z-WIN (20.x) klappt supper.

Ich hab mit 7z (Win) und RAR5 immer wieder Probleme - Manche 5er klappen, manche nicht. K.a. warum. Andere Kompression die von 7z nicht supportet wird?

Yuuri schrieb:
Dann arbeite ganz normal mit den üblichen Streams.
Code:
# leitet stdout um
$ unrar ... > /path/to/stdout.log
...
da htte ich eine Übersicht zu gefunden - aber klappte nicht ... 2>> wirft mir halt nur die Datei IM Archiv raus die defekt ist. Aber damit weiß ich nicht wie das Archiv heißt ... Mir fehlte der ARCHIVNAME (und das ganze als 1-Zeiler in der Error.txt)

Yuuri schrieb:
Weiterhin solltest du die Exit Codes prüfen.

Wie gesagt: das hab ich ...
https://docs.oracle.com/cd/E86824_01/html/E54763/unrar-1.html
https://linux.die.net/man/1/unzip
Da sind die nötigen Exit-Codes die ich mit $? erhalte. Hab mein Script jetzt fertig - paar der Exit-Codes in ein CASE übernommen und je nach Error anderer Fehler in der error.txt (inkl. Dateinamen) [Case war nur Just4Fun ... Archiv hat fehler - dann ist eh ende mit Automatischer verarbeitung - egal was für ein Fehler; könnte einfach den Exitcode prüfen auf 0 = alles ok] ...

Yuuri schrieb:
Weiterhin solltest du die Exit Codes prüfen.
Code:
$ unrar ... && echo "Kein Fehler" || echo "Fehler"
[/QUOTE]

Die schreibweise ist interessant. Muss ich mir später mal näher anschauen. Könnte "Platz" sparen (da mich wie gesagt nur "Fehler" interessiert)

Jetzt muss ich noch gucken wie ich mit speziellen Inhalten der Archive umgehe. Bei einem anderen Script was ich mir geschrieben hatte, hatte ich beim Entpacken probleme mit Leerschritten, Umlauten (alles gelöst) ... nur das Script hier arbeitet mit leicht anderen Archiven ... da kann an Zeichen ALLES drin sein :( Nervig was manche Leute so verpacken...

Danke dir!
 
Zurück
Oben