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
Unzip-Problem
Re: Unzip-Problem
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
#!/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
Re: Unzip-Problem
Das continue ist da aber überflüssig *klugscheiss*
Ansonsten sehr schönes Skript.
Ansonsten sehr schönes Skript.
Re: Unzip-Problem
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
<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
Re: Unzip-Problem
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">
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">
Re: Unzip-Problem
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
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
Re: Unzip-Problem
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
Jochen
Re: Unzip-Problem
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
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
Re: Unzip-Problem
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
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