Ich möchte den Dateinamen (ohne Erweiterung) und die Erweiterung separat abrufen.
Die beste Lösung, die ich bis jetzt gefunden habe, ist:
NAME=`echo "$FILE" | cut -d'.' -f1`
EXTENSION=`echo "$FILE" | cut -d'.' -f2`
Das ist falsch, weil es nicht funktioniert, wenn der Dateiname mehrere .
Zeichen enthält. Wenn ich, sagen wir, a.b.js
habe, wird es a
und b.js
berücksichtigen, anstatt a.b
und js
.
In Python kann man das leicht machen mit
file, ext = os.path.splitext(path)
aber ich würde es vorziehen, keinen Python-Interpreter dafür zu starten, wenn möglich.
Irgendwelche besseren Ideen?
Ermitteln Sie zunächst den Dateinamen ohne Pfadangabe:
filename=$(basename -- "$fullfile")
extension="${filename##*.}"
filename="${filename%.*}"
Alternativ können Sie sich auf das letzte "/" des Pfades konzentrieren, was auch bei unvorhersehbaren Dateierweiterungen funktionieren sollte:
filename="${fullfile##*/}"
Schauen Sie in der Dokumentation nach:
~% FILE="example.tar.gz"
~% echo "${FILE%%.*}"
example
~% echo "${FILE%.*}"
example.tar
~% echo "${FILE#*.}"
tar.gz
~% echo "${FILE##*.}"
gz
Weitere Details finden Sie unter shell parameter expansion im Bash-Handbuch.
pax> echo a.b.js | sed 's/\.[^.]*$//'
a.b
pax> echo a.b.js | sed 's/^.*\.//'
js
funktioniert gut, Sie können also einfach verwenden:
pax> FILE=a.b.js
pax> NAME=$(echo "$FILE" | sed 's/\.[^.]*$//')
pax> EXTENSION=$(echo "$FILE" | sed 's/^.*\.//')
pax> echo $NAME
a.b
pax> echo $EXTENSION
js
Die Befehle funktionieren übrigens wie folgt.
Der Befehl für NAME
ersetzt ein "."
-Zeichen, gefolgt von einer beliebigen Anzahl von Nicht-"."
-Zeichen bis zum Ende der Zeile, durch nichts (d.h. er entfernt alles vom letzten "."
bis zum Ende der Zeile, einschließlich). Dies ist im Grunde eine nicht-grausame Ersetzung mit Hilfe von Regex-Tricksereien.
Der Befehl für EXTENSION
ersetzt eine beliebige Anzahl von Zeichen, gefolgt von einem "."
Zeichen am Anfang der Zeile, durch nichts (d.h. er entfernt alles vom Anfang der Zeile bis zum letzten Punkt, einschließlich). Dies ist eine gierige Ersetzung, die die Standardaktion ist.