Ich möchte ein Skript schreiben, um nur die Erweiterung des Eingabedateinamens zurückzugeben. Zum Beispiel textfile.txt
sollte zurückkehren txt
.
Ich bin neu in Linux und Bash und versuche zu lernen, wie man grundlegende Skripte schreibt. Vielen Dank!
linux-4.2.3.tar.xz
Dateierweiterung, die Sie von kernel.org herunterladen können ? Welche/bin/bash
Dateierweiterung ist auf Ihrem System mit Sicherheit verfügbar? Sie sehen, das Konzept der "Dateierweiterung" ist unter Linux ziemlich fremd. Der Teil nach dem Punkt hat für das System nur eine sehr geringe Bedeutung - er ist eher ein Hinweis für den Benutzer, was er von dieser Datei erwarten könnte. Und dieses Stichwort kann lügen oder falsch sein.Antworten:
Die Shell, zum Beispiel bash, verfügt über viele Funktionen zur Manipulation von Zeichenfolgen . Mit einer davon können Sie alles bis zu einem bestimmten Muster entfernen:
Die obige Syntax entfernt alles aus der Variablen
$VAR
bis zur ersten Übereinstimmung des GlobGLOB
. Um die Dateierweiterung ohne Namen zu drucken, haben Sie folgende Möglichkeiten:Beachten Sie, dass dies auch mehr als eine "Erweiterung" betreffen kann:
Wenn Sie das nicht möchten, verwenden Sie
#
stattdessen eine, wodurch die kürzeste Übereinstimmung anstelle der längsten entfernt wird:Um dies für alle Dateien in einem Verzeichnis auszuführen, können Sie Folgendes tun:
Der Vollständigkeit halber können Sie den Dateinamen auch ohne Erweiterung abrufen, indem Sie
${file%.*}
:quelle
file="/foo/var/.git/foo/bar.bz"; echo "${file##*.}"
:bz
. Ich sehe kein Problem.Mit Parametererweiterung :
Das
${parameter##word}
Muster entfernt das größte übereinstimmende Präfixword
(alles außer dem Dateiende).quelle
Ein sehr einfaches Bash-Skript, das das tun könnte, was Sie wollen, wäre das Folgende:
Das Skript wird als aufgerufen
script.sh test.txt
, und was es tut, istes wird
$1
auf stdout gedruckt .$1
ist in diesem Fall der erste Parameter, der dem Skript zugewiesen wirdtest.txt
.Die stdout-Ausgabe von
echo
wird an stdin weitergeleitet, fürawk
die der String (test.txt
) aufgeteilt wird,.
und druckt dann das letzte Element des Split (txt
in diesem Fall).Nur eine kleine Bemerkung, dies kann mit einem Einzeiler gemacht werden, weil es eine ziemlich einfache Aufgabe ist:
quelle
$1
, oder Sie riskieren, Dateinamen zu brechen, die Leerzeichen usw. enthalten.Lauf:
Ausgabe:
Weitere Informationen: Erweiterung der Shell-Parameter | gnu.org
quelle
Zu diesem Zweck sind einige Einschränkungen zu beachten:
foo.d/bar
Datei hat keine Erweiterung, es ist keinefoo
Datei mit einer.d/bar
Erweiterung..bashrc
keine Erweiterung hat.
und..
spezielle Verzeichnisdateien sollten wahrscheinlich speziell behandelt werden und keine Erweiterung haben.file.tar.gz
?gz
odertar.gz
? Was ist mitholiday.picture.jpg
oderbash-4.4
?foo.d/
? Leer oderd
?Hier würde ich tun:
quelle
Ich werde einige weitere Optionen hinzufügen, falls Sie
sed
oder Perl installiert haben:s/^[^.]*\.//p
insed
unds/^.*?\.//&&print
inperl
: Versuchen Sie, die kürzeste Folge von Zeichen zu ersetzen, auf die am Anfang der Zeichenfolge kein Zeichen.
folgt.
. Wenn die Ersetzung vorgenommen werden könnte, drucken Sie das Ergebnis der Ersetzung aus.quelle
Achtung. Unter Unix / Linux (und MacOS) ist die "Dateinamenerweiterung" nur informativ (wenn so viel). Sie können perfekt ein Perl-Skript
photo.gif
oder eine GIF-Datei mit dem Namen habenpoem.txt
. Oder sogar eine Datei namenssome.txt.png
.quelle