'unp' liegt übrigens in contrib, da es von unrar abhängt, welches in non-free abgelegt ist. Die, die das nicht verstehen, betrifft das wohl eh nicht. Der Rest sollte wissen, was damit gemeint ist.
Hallo, es stimmt, ich kenne das "Original"-unp auch, allerdings ist es in perl geschrieben (ich mag kein perl) und hat zumindest unter debian nervige abhängigkeiten zu Entpackern, die ich überhaupt nicht brauche (z.B. cabextract und unzoo), die ich dann aber mitinstallieren müsste. Deswegen ratzbatz ein eigenes Skript gebastelt. Vielleicht weckt dieses einfache Bespiel ja das Interesse am scripten. Ich kann nur jedem fortgeschrittenen Linuxer empfehlen, mal in den advanced bash scripting guide (auf www.linuxdoc.org zu finden) reinzuschmökern.
Tja aber Perl ist nunmal geiler und kann man für mehr gebrauchen, habe diese Woche ein Script geschrieben, das früher als bash script gelaufen ist, nur in Perl waren es jetzt in etwa die Hälfte der Zeilen(zwar immer noch 1600 Zeilen Code) mit der gleichen Funktionalität und das Programm braucht nur noch in etwa die Hälfte der Zeit um seine Aufgabe zu erfüllen:-)
aehm, ich will ja nicht staenkern, aber ein Tool namens unp gibt es schon, und spannenderweise macht es auch genau das selbe *g* Ist auch ein shell-Script, zu finden unter /usr/bin/unp
Es gibt zig Programme die im Prinzip das gleiche machen (Mail-Reader, etc.). Wenn da jeder gesagt haette: Brauchen wir nicht, gibts schon einen, waere die Softwarewelt doch ziemlich eintoenig oder?
Das ist ein Shell-Programmiertrick. Er soll verhindern, daß es einen Syntaxfehler gibt, wenn $1 leer ist. Es wäre aber lesbarer, zu schreiben: while [ "$1" != "" ]. Oder, in diesem speziellen Fall: while [ -n "$1" ] (-n steht für nonzero, -z für zero, was sich auf die Länge des Strings bezieht).
Wenn $1 mit "-" (Strich) anfängt kann das vom "[" (test) Befehl als Option interpretiert werden und unerwartete Effekte haben. Deswegen das hinzugefügte "x".
Bei Shell-Programmierung ist halt alles ein wenig anders
die while schleife wird solange durchlaufen, wie "$1" eine zeichenkette enthält. Wenn "$1" leer ist, dann steht in der abfrage x != x, was nicht mehr wahr ist und die schleife beendet.
"$1" ist dabei ein bezeichner für den ersten parameter nach dem kommando (in unserem fall ein archivname). mit dem befehl "shift" in der case-anweisung wird dann "$2" nach "$1" kopiert und so geht die schleife solange weiter, bis keine archivnamen mehr übergeben worden sind. Du kannst die whileschleife weglassen, wenn du immer nur ein einziges archiv auf einmal mit dem befehl entpacken willst.
Wem diese Lösung, unp, atool und wie sie alle heißen, zu primitiv sind :-), kann auch lz/uz nehmen: http://grumbeer.dyndns.org/download/lz.html. In die neueste Version habe ich Unterstützung von ACE eingebaut, leider hatte ich noch keine Zeit, diese online zu stellen.
Tolles Script, aber das unkrontrollierte Entpacken von Archiven ist eine gefaehrliche Sache! Da das Script frueher oder spaeter von dem User fuer andere Archive, als die hier fokussierten, benutzt, ist z.B. bei *.tgz Archiven eine grosse Gefahr, sich sein System zu versauen, wenn das Archiv nach "/" entpackt wird, und nicht im aktuellen Arbeitsverzeichnis. Oder wenn man gewoehnt ist, dass Archive _immer_ ein eigenes Unterverzeichnis erzeugen, und man damit eines entpackt, was es _nicht_ tut... Daher wuerde ich eine Archivvorschau einbauen, die abfragt, ob man moechte, was das Archiv Entpacken tun wuerde! ratte
Ein selbstentpackende RAR-Archiv im MS-DOS Format kann man gut auch mit unrar entpacken. Ich weiß allerdings nicht, ob das mit anderen Formaten auch geht.
klar, das skript braucht du nicht wirklich, du kannst auch alle archive mit ihren jeweiligen kommandozeilentools entpacken. aber dann musst du dir immer merken, welche schalter die brauchen (ok, bei unrar ist es einfach ) und wie sie alle heissen. das alles kann man dann bei einem skript vergessen, wenn es einmal nachgeschaut hat.
exe-archive kannst du mit wine versuchen zu entpacken. (einfach mit wine archiv.exe ausführen) Es klappt aber leider nicht immer.
wie kann man das Script denn ergänzen, damit es auch angegebene Pade (Ziel) nutzt ? bsp.: unp dateiname /Zielordner Mit dieser Funktion währe das dann echt ne gute Alternative zum "originalem" unp.
apt-get install unp
unp
'unp' liegt übrigens in contrib, da es von unrar abhängt, welches in non-free abgelegt ist.
Die, die das nicht verstehen, betrifft das wohl eh nicht. Der Rest sollte wissen, was damit gemeint ist.
Gruss, Michael
selben Zeit Nur warst du mitm Tippen schneller *g*
Grus
TheJester
es stimmt, ich kenne das "Original"-unp auch, allerdings ist es in perl geschrieben (ich mag kein perl) und hat zumindest unter debian nervige abhängigkeiten zu Entpackern, die ich überhaupt nicht brauche (z.B. cabextract und unzoo), die ich dann aber mitinstallieren müsste.
Deswegen ratzbatz ein eigenes Skript gebastelt. Vielleicht weckt dieses einfache Bespiel ja das Interesse am scripten. Ich kann nur jedem fortgeschrittenen Linuxer empfehlen, mal in den advanced bash scripting guide (auf www.linuxdoc.org zu finden) reinzuschmökern.
aehm, ich will ja nicht staenkern, aber ein Tool namens
unp gibt es schon, und spannenderweise macht es auch
genau das selbe *g* Ist auch ein shell-Script, zu
finden unter /usr/bin/unp
apt-get install unp
Gruss
TheJester
was bedeutet denn die Abfrage: while [ x"$1" != x ]; do ?
Bis denn...
wie ich auch erst letztens gelernt habe:
Wenn $1 mit "-" (Strich) anfängt kann das vom "[" (test) Befehl als Option interpretiert werden und unerwartete Effekte haben. Deswegen das hinzugefügte "x".
Bei Shell-Programmierung ist halt alles ein wenig anders
"$1" ist dabei ein bezeichner für den ersten parameter nach dem kommando (in unserem fall ein archivname). mit dem befehl "shift" in der case-anweisung wird dann "$2" nach "$1" kopiert und so geht die schleife solange weiter, bis keine archivnamen mehr übergeben worden sind. Du kannst die whileschleife weglassen, wenn du immer nur ein einziges archiv auf einmal mit dem befehl entpacken willst.
Da das Script frueher oder spaeter von dem User fuer andere Archive, als die hier fokussierten, benutzt, ist z.B. bei *.tgz Archiven eine grosse Gefahr, sich sein System zu versauen, wenn das Archiv nach "/" entpackt wird, und nicht im aktuellen Arbeitsverzeichnis. Oder wenn man gewoehnt ist, dass Archive _immer_ ein eigenes Unterverzeichnis erzeugen, und man damit eines entpackt, was es _nicht_ tut...
Daher wuerde ich eine Archivvorschau einbauen, die abfragt, ob man moechte, was das Archiv Entpacken tun wuerde!
ratte
Teilst Du uns noch deine ergänzenden Zeilen mit!!
[ `tar tfz ${1} | head -n 1 | grep '/'` ] && create_dir=1 || create_dir=0
[ ${create_dir} = 1 ] && DIR=`tar tfz ${1} | head -n 1 | cut -d "/" -f1`
Das Problem ist, man müßte überprüfen, ob $DIR wirklich vor _jeder_ Datei im Archiv steht. Da weiß ich nicht, wie ich das machen könnte.
for X in `tar tvfz ${1}`; do
[ `echo ${X} | cut -d "/" -f1` = ${DIR} ] || exit 1
done
Ginge das ? Halt entsprechend anders für andere Packer.
Sollte create_dir Null sein, so käme eine Frage ob ein gleichnahmiges Unterverzeichnis erstellt werden soll.
Das wäre am elegantesten ?!
Wolle
klar, das skript braucht du nicht wirklich, du kannst auch alle archive mit ihren jeweiligen kommandozeilentools entpacken. aber dann musst du dir immer merken, welche schalter die brauchen (ok, bei unrar ist es einfach ) und wie sie alle heissen. das alles kann man dann bei einem skript vergessen, wenn es einmal nachgeschaut hat.
exe-archive kannst du mit wine versuchen zu entpacken. (einfach mit wine archiv.exe ausführen) Es klappt aber leider nicht immer.
Dass es auch mit RAR-Archiven geht, wusste ich nicht. Danke fuer den Tipp.
Gruß
Matthias
bsp.: unp dateiname /Zielordner
Mit dieser Funktion währe das dann echt ne gute Alternative zum "originalem" unp.