Mehrere Archive auf einmal entpacken

Gestern war ich mit diesem Problem konfrontiert: Mehr als ein Dutzend Archive musste ich entpacken, allerdings wollte ich nicht alle einzeln entpacken. Zum Glück hilft ein Einzeiler für die Bash, um das Problem elegant zu lösen.

Der Ausgangspunkt

Der Quellcode zu einem Video-Tutorial kam zu mir als Archiv, welches wiederum 18 weitere Archive enthielt. Die Liste der 18 Archive zeigt der folgende Code-Ausschnitt. Hinzu kommt noch, dass jedes Archiv keine Ordnerstruktur besitzt. Benutze ich im Kontextmenü von Nautilus den Eintrag Hier entpacken, überschreibt mir das zweite Archiv die Dateien aus dem ersten Archiv.

michael@Z30t:~/Downloads/Web Development with AngularJS and Bootstrap$ lh
insgesamt 148K
-rw-r--r-- 1 michael michael 1,3K Okt 28  2014 Code Bundle 2.1.zip
-rw-r--r-- 1 michael michael 1,7K Okt 28  2014 Code Bundle 2.2.zip
-rw-r--r-- 1 michael michael 2,5K Okt 28  2014 Code Bundle 2.3.zip
-rw-r--r-- 1 michael michael  11K Okt 29  2014 Code Bundle 2.4.zip
-rw-r--r-- 1 michael michael 2,7K Nov  3  2014 Code Bundle 3.1.zip
-rw-r--r-- 1 michael michael 2,8K Nov  3  2014 Code Bundle 3.2.zip
-rw-r--r-- 1 michael michael 3,8K Nov  3  2014 Code Bundle 3.3.zip
-rw-r--r-- 1 michael michael 3,8K Nov  3  2014 Code Bundle 3.4.zip
-rw-r--r-- 1 michael michael 4,5K Nov  8  2014 Code Bundle 4.1.zip
-rw-r--r-- 1 michael michael 5,5K Nov  8  2014 Code Bundle 4.2.zip
-rw-r--r-- 1 michael michael 5,7K Nov  8  2014 Code Bundle 4.3.zip
-rw-r--r-- 1 michael michael 8,4K Nov  8  2014 Code Bundle 4.4.zip
-rw-r--r-- 1 michael michael 6,8K Nov 17  2014 Code Bundle 5.1.zip
-rw-r--r-- 1 michael michael 9,1K Nov 17  2014 Code Bundle 5.2.zip
-rw-r--r-- 1 michael michael  11K Nov 17  2014 Code Bundle 5.3.zip
-rw-r--r-- 1 michael michael  12K Nov 24  2014 Code Bundle 6.1.zip
-rw-r--r-- 1 michael michael  12K Nov 24  2014 Code Bundle 6.2.zip
-rw-r--r-- 1 michael michael  13K Nov 24  2014 Code Bundle Complete.zip

Die Lösung

Eine einfache for-Schleife erledigt das Entpacken aller Archive für uns. Dabei gibt es jedoch ein paar Dinge zu beachten:

  • Die Dateinamen enthalten Leerzeichen, weshalb $file in Anführungszeichen stehen muss.
  • Mit dem Parameter -d kann man unzip ein Zielverzeichnis übergeben.
  • Durch $() führen wir einen Befehl aus und können das Ergebnis als Zeichenfolge verwenden. Da diese Zeichenfolge Leerzeichen enthält sind umschließende Anführungszeichen erforderlich.
  • basename gibt den Dateinamen ohne vollständigen Pfad aus. Mit Hilfe des zweiten Arguments kann man außerdem die Dateiendung entfernen. In diesem Fall spielt nur letztere Funktion eine Rolle.

Der Code in formatierter Darstellung

for file in "*.zip"
do
  unzip "$file" -d "$(basename "$file" .zip)"
  rm "$file"
done

Der Code als Einzeiler

for file in "*.zip"; do unzip "$file" -d "$(basename "$file" .zip)"; rm "$file"; done

Das Ergebnis

Wie gewünscht erhalten wir einen Ordner pro Archiv. Die Archive wurden erfolgreich mit rm gelöscht.

michael@Z30t:~/Downloads/Web Development with AngularJS and Bootstrap$ lh
insgesamt 72K
drwxr-xr-x 2 michael michael 4,0K Dez 29 17:15 Code Bundle 2.1
drwxr-xr-x 2 michael michael 4,0K Dez 29 17:15 Code Bundle 2.2
drwxr-xr-x 2 michael michael 4,0K Dez 29 17:15 Code Bundle 2.3
drwxr-xr-x 2 michael michael 4,0K Dez 29 17:15 Code Bundle 2.4
drwxr-xr-x 2 michael michael 4,0K Dez 29 17:15 Code Bundle 3.1
drwxr-xr-x 2 michael michael 4,0K Dez 29 17:15 Code Bundle 3.2
drwxr-xr-x 2 michael michael 4,0K Dez 29 17:15 Code Bundle 3.3
drwxr-xr-x 2 michael michael 4,0K Dez 29 17:15 Code Bundle 3.4
drwxr-xr-x 2 michael michael 4,0K Dez 29 17:15 Code Bundle 4.1
drwxr-xr-x 2 michael michael 4,0K Dez 29 17:15 Code Bundle 4.2
drwxr-xr-x 2 michael michael 4,0K Dez 29 17:15 Code Bundle 4.3
drwxr-xr-x 2 michael michael 4,0K Dez 29 17:15 Code Bundle 4.4
drwxr-xr-x 4 michael michael 4,0K Dez 29 17:15 Code Bundle 5.1
drwxr-xr-x 2 michael michael 4,0K Dez 29 17:15 Code Bundle 5.2
drwxr-xr-x 2 michael michael 4,0K Dez 29 17:15 Code Bundle 5.3
drwxr-xr-x 2 michael michael 4,0K Dez 29 17:15 Code Bundle 6.1
drwxr-xr-x 2 michael michael 4,0K Dez 29 17:15 Code Bundle 6.2
drwxr-xr-x 2 michael michael 4,0K Dez 29 17:15 Code Bundle Complete