(Zip) Archive rekursiv entpacken relativ von Hauptordner zu Zielordner

:D

Code:
Expand Collapse Copy
find "$Archive" -iname *.zip
Ist soweit klar, findet ausgehend vom weiter oben festgelegten Pfad alle Archivdateien und piped sie zu gsed.

Code:
Expand Collapse Copy
gsed -r "s#$Archive(\/.*\/).*#\1#"
gsed entfernt von allem, was kommt, vorn den Pfad zu den Archivdateien und hinten den Dateinamen. Die "Pfadrudimente" werden zu awk gepiped.

Code:
Expand Collapse Copy
awk -v "Archive=$Archive" -v "Daten=$Daten"
Hier werden Bash-Variablen zu awk-Variablen. Muss nicht sein, erleichtert aber das Quoting ungemein.


Code:
Expand Collapse Copy
{!a[$0]++}
Klassiker, awk liest die von gsed kommenden Pfade und packt sie in ein Array, wenn sie nicht schon drin sind.


Code:
Expand Collapse Copy
END {for (i in a) {cmd=sprintf("for f in \"%s%s*.zip\"; do mkdir -p \"%s%s\" && unzip \"$f\" -d \"%s%s\"; done\n",Archive, i, Daten, i, Daten, i); system(cmd)}}
Wenn von gsed nichs mehr kommt, bastelt awk mit der Funktion sprintf() eine Kommandozeile in der Variablen cmd zusammen, die an die Prozedur system() übergeben werden kann. Das ist notwendig, weil man innerhalb des system-Parameters nur ganz eingeschränkte Quoting-Möglichkeiten hat.


Code:
Expand Collapse Copy
"for f in \"%s%s*.zip\"
Diese Bash-for-Schleife ist notwendig, weil Bash das "*.zip" sofort erweitert und alle in diesem Pfad gefundenen Archive auf einmal an unzip übergibt, was sich daraufhin mit einer Fehlermeldung verabschiedet.


Code:
Expand Collapse Copy
mkdir -p \"%s%s\"
unzip meckert manchmal rum, wenn der Zielpfad nicht existiert. Manchmal auch nicht. Es schadet jedenfalls nicht.


Code:
Expand Collapse Copy
unzip \"$f\"
unzip bekommt seinen Quellpfad aus der for-Schleife als Bash-Variable.


Code:
Expand Collapse Copy
-d \"%s%s\"
unzip bekommt seinen Zielpfad, der sich aus dem anfangs definierten "Daten=" und dem von gsed extrahierten "Restpfad" zusammensetzt.

Dann noch das Ganze mit system() an Bash übergeben- thats all. :cool:
 
Zurück
Oben