Unzip-Problem

Post Reply
Message
Author
jascha

Unzip-Problem

#1 Post by jascha »

Hallo,
ich bin auf der Suche nach einem Befehl, mit dem ich
alle in einem Verzeichnis liegenden Zip-Dateien
automatisch in einen gleichnamigen Ordner entpacken
kann, so dass ich nicht für jede zu entpackende
Datei immer ein Zielverzeichnis angeben muss.
Beispiel:
ich bin im Verzeichnis /home/username, in dem die
Zip-Dateien Linux.zip, Abrechnung.zip und MP3.zip
liegen. Nun sollen diese drei Zip-Files in jeweils in
einen neu zu erzeugenden Ordner mit den Namen
"Linux", "Abrechnung" und "MP3" entpackt werden.
Ja, ich habe die Manpage zu "unzip" gelesen. Dort habe
ich gelesen, dass man mit
<i>unzip -d exdir filename</i> das
Zielverzeichnis angibt. Wenn ich nun aber
<i>unzip -d */ *</i> eingebe, werden alle
Zip-Dateien in das neue Verzeichnis * entpackt. Ist ja
auch logisch, aber wie bringe ich das unzip-Kommando
dazu, das zu machen was ich will ?

greets, jascha

Jochen

Re: Unzip-Problem

#2 Post by Jochen »

Pi * Daumen könnte das so aussehen:<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">
#!/bin/bash

EXITCODE=0

for ARG ; do
NAME=$(basename "$ARG" .zip)
if mkdir "$NAME" ; then
unzip -d "$NAME" "$ARG"
else
echo "$0: Fehler beim Erstellen des Verzeichnisses, überspringe \<!--no-->"$ARG\<!--no-->"." >&2
(( EXITCODE += 1 ))
continue
fi
done

exit $EXITCODE
</font><hr></pre></blockquote>

In der Schleife über alle Argumente wird bei jedem einzelnen Argument der passende Verzeichnisname als Name des Archivs minus ".zip" ermittelt. Dieses wird dann erstellt; geht das schief (weil es schon existiert, Schreibberechtigung fehlt usw.), wird das betroffene Archiv übersprungen. Ansonsten wird das Archiv in das frisch erstellte Verzeichnis ausgepackt. Rückgabewert des Skripts ist die Anzahl der nicht ausgepackten Archive.

Übrigens ist dieses Skript ohne Gewähr, da ich es nur auf die Schnelle hier reingehackt habe. Sollte funzen, melde Dich einfach noch mal, wenn es Fehler gibt.

Jochen

vyper
Posts: 19
Joined: 27. Feb 2002 23:12

Re: Unzip-Problem

#3 Post by vyper »

Das continue ist da aber überflüssig *klugscheiss*

Ansonsten sehr schönes Skript.

Jochen

Re: Unzip-Problem

#4 Post by Jochen »

Oooooooooookkkkkaaaaayyyyyyyy............ <img src="http://www.pl-forum.de/UltraBoard/Images/Happy.gif" border="0" align="middle">
<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">
#!/bin/bash

EXITCODE=0

for ARG ; do
NAME=$(basename "$ARG" .zip)
if ! mkdir "$NAME" ; then
echo "$0: Fehler beim Erstellen des Verzeichnisses, überspringe \"$ARG\"." >&2
(( EXITCODE += 1 ))
continue
fi
unzip -d "$NAME" "$ARG"
done

exit $EXITCODE
</font><hr></pre></blockquote>

Besser so? <img src="http://www.pl-forum.de/UltraBoard/Images/Wilk.gif" border="0" align="middle">

Jochen

vyper
Posts: 19
Joined: 27. Feb 2002 23:12

Re: Unzip-Problem

#5 Post by vyper »

Schon besser *g*

Es geht aber noch wesentlich kürzer

<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">#!/bin/bash

for ARG; do
unzip -d `basename $ARG .zip` $ARG
done</font><hr></pre></blockquote>

Unzip legt das Verzeichnis nämlich freiwillig an <img src="http://www.pl-forum.de/UltraBoard/Images/Wilk.gif" border="0" align="middle">

Jochen

Re: Unzip-Problem

#6 Post by Jochen »

Nur ist Kürze nicht alles: Was, wenn das Verzeichnis schon existiert und einen Inhalt hat, der sich vom Archiv unterscheidet? Das gibt einen wundervollen Mischmasch...

Also lieber "So korrekt wie nötig, so kurz wie möglich". Und im Zweifelsfalle finde ich a) Lesbarkeit und b) einen aussagefähigen Exitcode meiner Skripte doch auch sehr praktisch. <img src="http://www.pl-forum.de/UltraBoard/Images/Wilk.gif" border="0" align="middle">

Jochen

Jochen

Re: Unzip-Problem

#7 Post by Jochen »

Ach ja, einen habe ich noch: Ruf Dein Skript mal mit dem Argument "Gemeiner Name.zip" auf (inkl. Anführungszeichen) auf. Die Datei sollte natürlich auch existieren. Siehst Du das Problem? <img src="http://www.pl-forum.de/UltraBoard/Images/Happy.gif" border="0" align="middle">

Jochen

LBS

Re: Unzip-Problem

#8 Post by LBS »

Tach,

na ich hoffe Ihr habt euch geeinigt welches Skript genommen wird <img src="http://www.pl-forum.de/UltraBoard/Images/Wilk.gif" border="0" align="middle">
hätte da mal eine frage zu dem skript von Jochen, für was sind denn die beiden Klammern um den EXITCODE += 1 ???

Danke

cu

Jochen

Re: Unzip-Problem

#9 Post by Jochen »

Och, das mit dem Skript ist harmlos. Sascha und ich haben scheinbar den gleichen Drang zum Klugscheissen. <img src="http://www.pl-forum.de/UltraBoard/Images/Happy.gif" border="0" align="middle">

Die doppelten runden Klammern sind die arithmetische Evaluierung der bash; die Schreibweisen <pre>let "E += 1"</pre>und<pre>(( E += 1 ))</pre>sind äquivalent.
Man spart sich das expr, dass in der alten sh immer nötig war. Und wenn man mal schnell etwas rechnen muss (zumindest im Integerbereich), kann man auch noch ein $ vor die doppelten runden Klammern setzen:

echo $(( 28 * 3 + 6))

ergibt die erwarteten 90 als Ausgabe.

Jochen

Post Reply