Wie bekomme ich die Dateierweiterung von Bash? Folgendes habe ich versucht:
filename=`basename $filepath`
fileext=${filename##*.}
Auf diese Weise kann ich eine Erweiterung des bz2
Pfads erhalten /dir/subdir/file.bz2
, aber ich habe ein Problem mit dem Pfad /dir/subdir/file-1.0.tar.bz2
.
Ich würde eine Lösung vorziehen, die nur Bash ohne externe Programme verwendet, wenn es möglich ist.
Um meine Frage zu klären, habe ich ein Bash-Skript erstellt, um ein bestimmtes Archiv mit einem einzigen Befehl von zu extrahieren extract path_to_file
. Wie die Datei extrahiert wird, bestimmt das Skript anhand des Komprimierungs- oder Archivierungstyps, der .tar.gz, .gz, .bz2 usw. sein kann. Ich denke, dies sollte Zeichenfolgenmanipulation beinhalten, z. B. wenn ich die Erweiterung bekomme, .gz
dann habe ich sollte .tar
vorher prüfen, ob es die Zeichenfolge hat .gz
- wenn ja, sollte die Erweiterung sein .tar.gz
.
.tar.bz2
Antworten:
Wenn der Dateiname lautet
file-1.0.tar.bz2
, lautet die Erweiterungbz2
. Die Methode, mit der Sie die Erweiterung (fileext=${filename##*.}
) extrahieren, ist vollkommen gültig¹.Wie entscheiden Sie, ob Sie die Erweiterung haben möchten oder
tar.bz2
nicht ? Sie müssen diese Frage zuerst beantworten. Dann können Sie herausfinden, welcher Shell-Befehl Ihrer Spezifikation entspricht.bz2
0.tar.bz2
Eine mögliche Spezifikation ist, dass Erweiterungen mit einem Buchstaben beginnen müssen. Diese Heuristik schlägt für ein paar gängige Erweiterungen wie fehl
7z
, die am besten als Sonderfall behandelt werden könnten. Hier ist eine bash / ksh / zsh-Implementierung:Für die POSIX-Portabilität müssen Sie eine
case
Anweisung für den Mustervergleich verwenden.Eine weitere mögliche Spezifikation besteht darin, dass einige Erweiterungen Codierungen bezeichnen und anzeigen, dass weiteres Abisolieren erforderlich ist. Hier ist eine bash / ksh / zsh-Implementierung (erfordert
shopt -s extglob
under bash undsetopt ksh_glob
under zsh):Beachten Sie, dass dies
0
eine Erweiterung von istfile-1.0.gz
.¹ und verwandte Konstrukte sind in POSIX enthalten , daher funktionieren sie in jeder nicht-antiken Bourne-Shell wie z. B. ash, bash, ksh oder zsh.
${VARIABLE##SUFFIX}
quelle
.
Token ein Archivtyp ist, z. B.tar
ob sein nicht-Archivtyp wie die0
Iteration enden sollte..patch.lzma
. Eine bessere Heuristik die Zeichenfolge zu betrachten wäre nach dem letzten.
: Wenn es sich um eine Kompression Suffix ist (.7z
,.bz2
,.gz
, ...), weiter Strippen.Sie können die Sache vereinfachen, indem Sie nur einen Mustervergleich für den Dateinamen durchführen, anstatt die Erweiterung zweimal zu extrahieren:
quelle
Kommentare dazu hier: http://liquidat.wordpress.com/2007/09/29/short-tip-get-file-extension-in-shell-script/
quelle
.tar.gz
VerlängerungHier ist mein Versuch: Punkte in Zeilenumbrüche übersetzen, durchkreuzen,
tail
letzte Zeile holen:quelle
Beispielsweise:
quelle
printf
wenn der Dateiname einen umgekehrten Schrägstrich enthält oder mit Folgendem beginnt-
:"${filename#$(printf %s "$filename" | sed 's/\.[^[:digit:]].*$//g;')}"
Eines Tages habe ich diese kniffligen Funktionen erstellt:
Ich habe diesen einfachen Ansatz gefunden, der in vielen Fällen sehr nützlich ist, nicht nur, wenn es um Erweiterungen geht.
Zum Überprüfen von Erweiterungen - Es ist einfach und zuverlässig
Zum Abschneiden der Verlängerung:
Zum Ändern der Erweiterung:
Oder wenn Sie "praktische Funktionen" mögen:
PS Wenn Ihnen diese Funktionen gefallen haben oder Sie sie als gebraucht empfanden, lesen Sie bitte diesen Beitrag :) (und geben Sie hoffentlich einen Kommentar ab).
quelle
Die jackman case-based Antwort ist ziemlich gut und portabel, aber wenn Sie nur den Dateinamen und die Erweiterung in einer Variablen wollen, habe ich diese Lösung gefunden:
Es funktioniert nur mit doppelten Erweiterungen und die erste muss "tar" sein.
Sie können jedoch die Testlinie "tar" mit einem Stringlängentest ändern und den Fix mehrmals wiederholen.
quelle
Ich habe es folgendermaßen gelöst:
Dies funktioniert jedoch nur für bekannte Archivierungsarten, in diesem Fall nur
tar
quelle