Linux / Befehl basename: Die letzte Komponente eines Pfads ermitteln
`basename` ist ein Befehl, der den Verzeichnisanteil aus einem Pfadstring entfernt und nur den endgültigen Dateinamen oder Verzeichnisnamen ausgibt. Optional kann auch ein Suffix am Ende des Dateinamens entfernt werden, was in Shell-Skripten nützlich ist, wenn ein Pfad in einen Anzeigenamen umgewandelt werden soll.
`basename` ist kein Befehl zum Öffnen von Dateien oder zum Überprüfen der Existenz eines Pfades. Er verarbeitet den Eingabestring, sodass er auch auf Pfade angewendet werden kann, die nicht existieren.
Ergänzende Befehle und Anwendungsfälle finden Sie in Liste der häufig verwendeten Befehle in Linux.
Was ist der Befehl basename?
Verwenden Sie `basename`, wenn Sie nur die letzte Komponente eines Pfads benötigen.
basename /home/user/report.txt
Die Ausgabe ist wie folgt.
report.txt
Es spielt keine Rolle, ob der Eingabepfad eine Datei oder ein Verzeichnis ist. Es wird der letzte Name nach Entfernung des abschließenden Schrägstrichs zurückgegeben.
Grundlegende Syntax und Verwendung
basename name [suffix] basename options name...
Ein einfaches Anwendungsbeispiel ist wie folgt.
basename /var/log/nginx/access.log basename /home/user/Documents/ basename relative/path/file.txt
Jedes Ergebnis ist `access.log, Documents und file.txt`. Alle unnötigen abschließenden Schrägstriche werden entfernt, aber spezielle Eingaben wie der Stammverzeichnis-Pfad werden separat behandelt.
Suffixe entfernen
Angeben eines Suffixes mit dem zweiten Argument
Wenn Sie ein Suffix nach dem Namen angeben, wird es entfernt, wenn der letzte Name mit dieser Zeichenkette endet.
basename /data/archive.tar.gz .gz basename /home/user/report.txt .txt
Die Ausgabe ist jeweils archive.tar und report. Um die gesamte .tar.gz zu entfernen, geben Sie die gesamte zu entfernende Zeichenkette an.
basename /data/archive.tar.gz .tar.gz
Suffixe von mehreren Namen mit -s entfernen
Die GNU basename -s oder --suffix Option gibt das Suffix als Option an. Die Verwendung dieser Option aktiviert auch das -a Verhalten, um mehrere Namen zusammen zu verarbeiten.
basename -s .jpg /images/a.jpg /backup/b.jpg basename --suffix=.log /var/log/app.log /tmp/test.log
Wenn das Suffix nicht übereinstimmt, wird der ursprüngliche letzte Pfadkomponente unverändert ausgegeben. Das Suffix ist eine Zeichenkette, die wörtlich verglichen wird, nicht ein Regex.
Verarbeitung mehrerer Pfade
Verarbeiten mehrerer Namen mit -a
Die Verwendung von -a oder --multiple ermöglicht die gleichzeitige Verarbeitung mehrerer Pfade und gibt jedes Ergebnis in einer separaten Zeile aus.
basename -a /srv/www/index.html /var/log/syslog /home/user
Die Ausgabe hat die folgende Form.
index.html syslog user
Mit NUL trennen mit -z
Dateinamen können Zeilenumbrüche enthalten. Um Mehrdeutigkeiten bei der Automatisierung zu vermeiden, können Sie NUL-Zeichen anstelle von Zeilenumbrüchen am Ende jedes Ergebnisses mit -z oder --zero ausgeben.
basename -z -a /data/file1 /data/file2
Ein nachgeschalteter Befehl, der die NUL-getrennte Ausgabe verarbeitet, muss dasselbe Format unterstützen. Es handelt sich um eine Funktion für die sichere Übertragung zwischen Programmen, nicht um eine Option zur direkten Anzeige auf dem Bildschirm.
Vergleich von basename und dirname
| Eingabe | basename |
dirname |
|---|---|---|
/home/user/report.txt |
report.txt |
/home/user |
docs/manual.pdf |
manual.pdf |
docs |
notes.txt |
notes.txt |
. |
/ |
/ |
/ |
Diese beiden Befehle sind praktisch, wenn Pfadstrings komplementär aufgeteilt werden. Das einfache Wiederverbinden der beiden Ausgaben mit einem Schrägstrich führt jedoch möglicherweise nicht zu einem identischen String wie das Original aufgrund doppelter Schrägstriche oder spezieller Eingaben.
Umgang mit Dateiendungen
Entfernen bekannter Erweiterungen
Wenn die zu entfernenden Erweiterungen festgelegt sind, ist die Verwendung des Suffix-Arguments eine klare Methode.
basename photo.webp .webp basename backup.tar.gz .tar.gz
Diese Methode entfernt die Erweiterung nur, wenn das Ende genau übereinstimmt, sodass bei report.txt.bak, .txt nicht entfernt wird.
Nicht automatisch alles nach dem letzten Punkt als Erweiterung betrachten
Nur weil ein Dateiname einen Punkt hat, bedeutet das nicht, dass er immer eine Erweiterung hat. Es gibt versteckte Dateien, die mit einem Punkt beginnen, wie .profile, Dateien mit mehreren Suffixen wie archive.tar.gz, und Namen, die mit einem Punkt enden.
Definieren Sie klar die zu entfernenden Suffixe nach Ihren Arbeitsregeln und seien Sie vorsichtig, wenn Sie einfach alles nach dem letzten Punkt löschen.
Verwendung in Shell-Skripten
Den Anzeigedateinamen aus einem Pfad erhalten
path='/srv/uploads/annual report.pdf' name=$(basename -- "$path") || exit 1 printf 'Filename: %s\n' "$name"
-- bewirkt, dass der folgende String als Name und nicht als Option behandelt wird. Dies ist nützlich, wenn es um Eingaben geht, die mit einem Bindestrich beginnen können, und es ist immer sicher, Variablen in doppelte Anführungszeichen zu setzen.
Vergleich mit POSIX Shell Parametererweiterung
Wenn Sie nur den letzten Teil eines Pfads innerhalb der Shell benötigen, können Sie auch Parametererweiterung anstelle von externen Befehlen verwenden.
path='/srv/uploads/report.pdf'
name=${path##*/}
printf '%s\n' "$name"
Wenn der Pfad jedoch mit einem Schrägstrich endet oder ein Stammverzeichnis ist, kann das Ergebnis von basename abweichen. Wenn das Eingabeformat nicht kontrolliert wird, gehen Sie nicht davon aus, dass Ihre benutzerdefinierten Stringregeln sich genauso verhalten wie basename.
Zusammenfassung der wichtigsten Optionen
| Option | Beschreibung |
|---|---|
-a, --multiple |
Mehrere Namen behandeln und jedes Ergebnis ausgeben. |
-s suffix, --suffix=suffix |
Entfernt das angegebene Suffix vom Ende jedes Namens und ermöglicht auch die Verarbeitung mehrerer Namen. |
-z, --zero |
Beendet jedes Ergebnis mit einem NUL-Zeichen anstelle eines Zeilenumbruchs. |
--help |
Zeigt die Verwendung und unterstützten Optionen an. |
--version |
Gibt die installierte GNU Coreutils-Version aus. |
Optionen wie -a, -s und -z sind GNU-Erweiterungen. Wenn Sie Skripte für verschiedene Unix-ähnliche Systeme schreiben, überprüfen Sie die Implementierung auf dem Zielsystem und geben Sie dem von POSIX definierten Standardformat Vorrang.
Häufige Probleme
Die Ergebnisse werden auch dann ausgegeben, wenn die Datei nicht existiert.
Dies ist normales Verhalten. basename extrahiert den letzten Teil aus dem Eingabestring, ohne die Existenz der Datei zu überprüfen. Wenn der Vorgang eine tatsächliche Datei erfordert, sollten Sie die Existenz und Berechtigungen separat prüfen.
Pfade mit Leerzeichen werden in mehrere Argumente aufgeteilt
Wenn Sie Variablen nicht in doppelte Anführungszeichen setzen, kann eine Wortaufsplitterung durch die Shell und eine Glob-Erweiterung auftreten.
basename -- "$path"
Suffix nicht entfernt
Das Suffix muss genau am Ende des letzten Namens übereinstimmen. Es ist case-sensitiv und wird nicht als regulärer Ausdruck oder Platzhalter interpretiert.
FAQ
Benennt basename die tatsächliche Datei um?
Nein. Es berechnet und gibt nur den letzten Namen aus dem eingegebenen Pfadstring aus, ohne Dateien oder Verzeichnisse zu ändern.
Kann basename eine Erweiterung entfernen?
Geben Sie das zu entfernende Suffix als zweites Argument an, beispielsweise basename path.txt .txt. GNU basename verarbeitet mit basename -s .txt name... auch mehrere Namen.
Funktioniert basename auf einem nicht existierenden Pfad?
Ja. Da es nur den Pfadstring verarbeitet, gibt es die letzte Komponente aus, auch wenn die tatsächliche Datei nicht existiert.
Was ist der Unterschied zu dirname?
basename gibt den letzten Namen aus, während dirname den Verzeichnisteil ohne den letzten Namen ausgibt.
Weitere Angaben zu Syntax, Implementierung und Verfügbarkeit finden Sie unter Offizielle GNU Coreutils basename Dokumentation und POSIX basename Spezifikation.




