Archiv verlassen und diese Seite im Standarddesign anzeigen : [bash] letzten 3 buchstaben einer variable in neue variable
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?
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.
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
danke für die antworten.
wusste nicht das es sowas schon gibt aber selbstgemacht rockt doch irgendwie mehr ;)
hat mit dem letzten perfekt funktioniert!
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
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ä
danke, jetzt funzt alles so wie ichs gern hätte
#!/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
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.