472 Stimmen

Extrahieren von Dateibasisnamen ohne Pfad und Erweiterung in der Bash

Bei Dateinamen wie diesen:

/the/path/foo.txt
bar.txt

Ich hoffe es zu bekommen:

foo
bar

Warum funktioniert das nicht?

#!/bin/bash

fullfile=$1
fname=$(basename $fullfile)
fbname=${fname%.*}
echo $fbname

Was ist der richtige Weg, um das zu tun?

13voto

higuaro Punkte 15232

Hier ist ein anderer (komplexerer) Weg, um entweder den Dateinamen oder die Erweiterung zu erhalten, verwenden Sie zunächst die rev um den Dateipfad zu invertieren, schneiden Sie vom ersten . und kehren Sie dann den Dateipfad wieder um, etwa so:

filename=`rev <<< "$1" | cut -d"." -f2- | rev`
fileext=`rev <<< "$1" | cut -d"." -f1 | rev`

2voto

vincent gravitas Punkte 354

Wenn Sie mit Windows-Dateipfaden spielen wollen (unter Cygwin), können Sie auch dies versuchen:

fname=${fullfile##*[/|\\]}

Dadurch werden die Backslash-Trennzeichen bei der Verwendung von BaSH unter Windows berücksichtigt.

1voto

Diomoid Punkte 91

Ich habe nur eine Alternative gefunden, um eine Erweiterung zu extrahieren, indem ich die Beiträge in diesem Thread mit meiner eigenen kleinen Wissensbasis, die mir vertrauter war, verwendet habe.

ext="$(rev <<< "$(cut -f "1" -d "." <<< "$(rev <<< "file.docx")")")"

Hinweis: Ich bitte um Ratschläge zu meiner Verwendung von Anführungszeichen; bei mir hat es funktioniert, aber vielleicht übersehe ich etwas, was die richtige Verwendung angeht (ich verwende wahrscheinlich zu viele).

-16voto

Bandicoot Punkte 3541

Verwenden Sie den Befehl basename. Die Manpage dazu finden Sie hier: http://unixhelp.ed.ac.uk/CGI/man-cgi?basename

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X