506 Stimmen

Wie entferne ich das Dateisuffix und den Pfadteil aus einer Pfadzeichenkette in der Bash?

Bei einem String-Dateipfad wie /foo/fizzbuzz.bar wie würde ich die Bash verwenden, um nur die fizzbuzz Teil der besagten Zeichenkette?

737voto

Zan Lynx Punkte 51045

Hier sehen Sie, wie man das mit den #- und %-Operatoren in der Bash macht.

$ x="/foo/fizzbuzz.bar"
$ y=${x%.bar}
$ echo ${y##*/}
fizzbuzz

${x%.bar} könnte auch sein ${x%.*} um alles nach einem Punkt zu entfernen oder ${x%%.*} um alles nach dem ersten Punkt zu entfernen.

Ejemplo:

$ x="/foo/fizzbuzz.bar.quux"
$ y=${x%.*}
$ echo $y
/foo/fizzbuzz.bar
$ y=${x%%.*}
$ echo $y
/foo/fizzbuzz

Die Dokumentation ist zu finden in der Bash-Handbuch . Suche nach ${parameter%word} y ${parameter%%word} nachlaufender Teil passender Abschnitt.

313voto

zigdon Punkte 13865

Sehen Sie sich den Befehl basename an:

NAME="$(basename /foo/fizzbuzz.bar .bar)"

weist es an, das Suffix zu entfernen .bar führt zu NAME=fizzbuzz

60voto

Param Punkte 571

Reine Bash, in zwei getrennten Vorgängen durchgeführt:

  1. Entfernt den Pfad aus einer Pfadzeichenkette:

    path=/foo/bar/bim/baz/file.gif
    
    file=${path##*/}  
    #$file is now 'file.gif'
  2. Entfernt die Erweiterung aus einer Pfadzeichenkette:

    base=${file%.*}
    #${base} is now 'file'.

20voto

mike Punkte 211

Mit basename habe ich dies wie folgt erreicht:

for file in *; do
    ext=${file##*.}
    fname=`basename $file $ext`

    # Do things with $fname
done;

Dies erfordert keine Vorkenntnisse der Dateierweiterung und funktioniert auch bei Dateinamen mit Punkten (vor der Erweiterung); es erfordert jedoch das Programm basename aber das ist Teil der GNU coreutils, also sollte es mit jeder Distribution ausgeliefert werden.

18voto

Jerub Punkte 40038

Die Funktionen basename und dirname sind genau das Richtige für Sie:

mystring=/foo/fizzbuzz.bar
echo basename: $(basename "${mystring}")
echo basename + remove .bar: $(basename "${mystring}" .bar)
echo dirname: $(dirname "${mystring}")

Hat Ausgang:

basename: fizzbuzz.bar
basename + remove .bar: fizzbuzz
dirname: /foo

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