GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Extrahieren Sie den Basisnamen der Datei ohne Pfad und Erweiterung in Bash

Der basename-Befehl hat zwei verschiedene Aufrufe; In einem geben Sie nur den Pfad an, in diesem Fall erhalten Sie die letzte Komponente, während Sie im anderen auch ein Suffix angeben, das entfernt wird. Sie können Ihren Beispielcode also vereinfachen, indem Sie den zweiten Aufruf von basename verwenden. Achten Sie auch darauf, Dinge korrekt zu zitieren:

fbname=$(basename "$1" .txt)
echo "$fbname"

Hier sind Einzeiler:

  1. 05
  2. 14

Ich brauchte das, genau wie von bongbang und w4etwetewtwet gefragt.


Sie müssen die externe 26 nicht anrufen Befehl. Stattdessen könnten Sie die folgenden Befehle verwenden:

$ s=/the/path/foo.txt
$ echo "${s##*/}"
foo.txt
$ s=${s##*/}
$ echo "${s%.txt}"
foo
$ echo "${s%.*}"
foo

Beachten Sie, dass diese Lösung in allen neueren (nach 2004) funktionieren sollte ) POSIX konforme Shells, (z. B. 38 , 45 , 55 usw.).

Quelle:Shell Command Language 2.6.2 Parametererweiterung

Mehr über Bash-String-Manipulationen:http://tldp.org/LDP/LG/issue18/bash.html


Eine Kombination aus basename und cut funktioniert gut, auch im Falle einer doppelten Endung wie 62 :

fbname=$(basename "$fullfile" | cut -d. -f1)

Wäre interessant, wenn diese Lösung weniger Rechenleistung benötigt als Bash Parameter Expansion.


Linux
  1. So verstecken Sie Dateien und Ordner im Dateimanager ohne Umbenennung

  2. Vollständige Ansicht, wo die Pfadvariable in Bash festgelegt ist?

  3. Tar:Einzelne Datei in ein Verzeichnis extrahieren, ohne Unterordner zu erstellen?

  4. Verwenden des Linux-Basisnamenbefehls in Bash-Skripten

  5. Wie normalisiert man einen Dateipfad in Bash?

Dateipfade verstehen und wie man sie unter Linux verwendet

So verwenden Sie ISPConfig und Seafile ohne manuelle Dateiänderungen

Eine Bash-Funktion zum Extrahieren von Dateiarchiven verschiedener Typen

Linux-tar-Befehl zum Komprimieren und Extrahieren von Dateien

bash:leite stderr auf Datei und stdout + stderr auf Bildschirm um

bash-Dateivervollständigung ohne Angabe von ./