PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [bash] letzten 3 buchstaben einer variable in neue variable



Doodles
25-06-2004, 11:43
Hallo,

Bin totaler anfänger in bash.

Ich wollte ein programm schreiben, dass das entpacken vereinfacht, dass ich nur z.B. unpack archiv.endung eingeben muss und das script benutzt dann das jeweilige entpack programm. Nun wollte ich das mit if then lösen, dass das Programm überprüft welche Endung die datei hat und dann das jeweilige Programm benutzt. daraus resultiert folgende Frage:

Gibt es eine Möglichkeit aus einer Variable z.B. $1 nur die letzten 3 Buchstaben in eine neue Variable zu packen?

brotzi
25-06-2004, 12:15
Ich denke Du brauchst einfach die Buchstaben, die nach dem letzten "." kommen.

echo 123.456.789 | sed 's/[[:alnum:]]*\.//g'
=> 789

mehlvogel
25-06-2004, 12:17
Sowas gibs schon (nur so als Anmerkung ;)):



unp - Description: unpack (almost) everything with one command
unp is a small perl script which makes extraction of any archive files
a bit easier. It support several compressors and archiver programs,
chooses the right one(s) automatically and extracts one or more files
in one go.


Ansonsten könntest du mit dem Befehl tr arbeiten um die Dateiendung zu erhalten, oder du arbeitest mit dem Befehl file - welcher dir das Format der Datei wieder gibt, dann musst du das nicht auf die Dateiendung stützen, sondern kannst es nach dem tatsächlichen Format auswählen.

roli
25-06-2004, 12:45
Schön gibt es so viele verschiedene Möglichkeiten um das gleiche zu tun. :) Ich hätte da noch folgendes anzubieten:

t=test.zip
echo ${t##*.}

Gibt ebenfalls alles nach letztem Punkt zurück

Doodles
25-06-2004, 14:03
danke für die antworten.

wusste nicht das es sowas schon gibt aber selbstgemacht rockt doch irgendwie mehr ;)

hat mit dem letzten perfekt funktioniert!

fs111
25-06-2004, 18:32
OK, da es ja nun eine Perl und eine Bash-Variante gibt, hier meine Python-Variante von diesem Programm:


#!/usr/bin/env python
import sys, os.path

tools = {
"tar.gz":"tar xvzf ",
"tar.bz2": "tar xvjf ",
"tgz" : "tar xvzf ",
"rar" : "rar x ",
"ace" : "unace x ",
"zip" : "unzip " }

archives = sys.argv[1:]

for arch in archives:
if os.path.isfile(arch):
for k in tools.iterkeys():
if arch.endswith(k):
os.system(tools[k]+arch )
break

fs111

Doodles
26-06-2004, 15:35
eine Frage hab ich dann doch noch:

Ich habe die python Variante von fs111 und die bash variante von mir (quelltext (http://mhfeeling.de/michi/unpack.txt)) ausprobiert jedoch können sie beide keine dateien entpacken, die ein leezeichen enthalten.

Wenn ich das mit der bash Version mache kommt folgende Fehlermeldung:

doodles@michael:~$ unpack thunder\ ka.tar.gz
/usr/local/bin/unpack: line 4: [: too many arguments
/usr/local/bin/unpack: line 9: [: thunder: binary operator expected
/usr/local/bin/unpack: line 13: [: thunder: binary operator expected
tar: thunder: Kann open nicht ausführen.: Datei oder Verzeichnis nicht gefunden
tar: Nicht behebbarer Fehler: Programmabbruch.
tar: Child returned status 2
tar: ka.tar.gz: Nicht im Archiv gefunden.
tar: Fehler beim Beenden, verursacht durch vorhergehende Fehler.
doodles@michael:~$

jemand ne Idee woran das liegt?

P.S. ich weiß ich könnte auch unp benutzen aber dann lern ich ja nix.

peschmae
26-06-2004, 16:12
du musst statt unzip $1 z.B. unzip "$1" schreiben

Genau so wie du auf der Shell auch statt unzip bla bla.zip entweder unzip "bla bla.zip" oder unzip bla\ bla.zip schreiben.

MfG Peschmä

Doodles
26-06-2004, 19:12
danke, jetzt funzt alles so wie ichs gern hätte

fs111
26-06-2004, 19:17
#!/usr/bin/env python
import sys, os.path

tools = {
"tar.gz":"tar xvzf ",
"tar.bz2": "tar xvjf ",
"tgz" : "tar xvzf ",
"rar" : "rar x ",
"ace" : "unace x ",
"zip" : "unzip " }

archives = sys.argv[1:]

for arch in archives:
if os.path.isfile(arch):
for k in tools.iterkeys():
if arch.endswith(k):
os.system(tools[k]+'"%s"' %(arch) )
break



Ok, ich habe den Fehler bei mir auch korrigiert.

fs111