find "$Archive" -iname *.zip
Ist soweit klar, findet ausgehend vom weiter oben festgelegten Pfad alle Archivdateien und piped sie zu
gsed.
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.
awk -v "Archive=$Archive" -v "Daten=$Daten"
Hier werden Bash-Variablen zu
awk-Variablen. Muss nicht sein, erleichtert aber das Quoting ungemein.
Klassiker,
awk liest die von
gsed kommenden Pfade und packt sie in ein Array, wenn sie nicht schon drin sind.
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.
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.
unzip meckert manchmal rum, wenn der Zielpfad nicht existiert. Manchmal auch nicht. Es schadet jedenfalls nicht.
unzip bekommt seinen Quellpfad aus der
for-Schleife als Bash-Variable.
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.