Wie gehe ich vor, um nur den Dateinamen einer Datei wiederzugeben, wenn ich ein Verzeichnis mit einer for-Schleife iteriere?
for filename in /home/user/*
do
echo $filename
done;
zieht den vollständigen Pfad mit dem Dateinamen. Ich möchte nur den Dateinamen.
${file##*/}
zu"${file##*/}"
zu wechseln , um Dateinamen mit Leerzeichen zu unterstützen, z. B. "Mein Dateiname mit Leerzeichen.txt".Verwenden Sie einfach
basename
:Die Anführungszeichen werden benötigt, wenn $ filename zB Leerzeichen enthält.
quelle
$()
wie Oli/test 1
,basename $(pwd)
output :test
. Getestet unter OS X und Ubuntu Server (14.04). Native Bash-Lösung, wie von @SiegeX empfohlen, hat bei mir funktioniert.basename "$(pwd)"
stattdessen.$PWD
verwenden, als den Befehl auszuführen.Verwendung
basename
:quelle
echo
?basename
druckt bereits die Ergebnisse.echo
kann das Ergebnis sogar entstellen, wenn Sie die Unterschale nicht zitieren. Beispiel:echo $(basename path/with\ \ spaces)
Druckt falschwith spaces
(nur ein Leerzeichen).Ein anderer Ansatz ist das
ls
Lesen der Dateiliste in einem Verzeichnis, um Ihnen das zu geben, was Sie möchten, dh "nur den / die Dateinamen". Im Gegensatz zum Lesen des vollständigen Dateipfads und anschließenden Extrahieren der Komponente "Dateiname" im Hauptteil der for-Schleife.Beispiel unten, das Ihrem Original folgt:
Wenn Sie das Skript im selben Verzeichnis wie die Dateien ausführen, wird es einfach zu:
quelle
ls
Enthält alle Punktedateien, bei denen die*
Erweiterung normalerweise nicht erfolgt.for f in $(...) ...
Schlägt auch fehl, wenn ein Dateiname Leerzeichen enthält, es sei denn, Sie setzen IFS, kann fehlschlagen, wenn ein Dateiname ein glob-Zeichen enthält, es sei denn, Sie setzen -f / -o noglob, und je nach System oder Shellecho
kann dies fehlschlagen, wenn ein Dateiname Bindestrich + Buchstabe ist oder Backslash enthält. OTOHls -1 /path/to/dir
druckt jeden Dateinamen für sich allein zuverlässig in eine Zeile, modulo den Unterschied zwischen den Punktedateien.Wenn Sie nur Dateinamen möchten:
Weitere Informationen zum
cut
Befehl finden Sie hier .quelle