it-swarm.com.de

Ubuntu-Bash-Skript: Wie kann ich den Pfad durch den letzten Schrägstrich aufteilen?

Ich habe eine Datei (zB list.txt), die relative Pfade zu Dateien enthält, einen Pfad pro Zeile, d. H.

foo/bar/file1
foo/bar/baz/file2
goo/file3

Ich muss ein Bash-Skript schreiben, das jeweils einen Pfad verarbeitet, beim letzten Schrägstrich aufteilt und dann einen anderen Prozess startet, der die beiden Teile des Pfads als Argumente füllt. Bisher habe ich nur den schleifen Teil:

for p in `cat list.txt`
do
   # split $p like "foo/bar/file1" into "foo/bar/" as part1 and "file1" as part2
   inner_process.sh $part1 $part2
done

Wie spalte ich? Funktioniert dies im entarteten Fall, wenn der Pfad keine Schrägstriche enthält?

Vielen Dank

40
I Z

Verwenden Sie basename und dirname, das ist alles was Sie brauchen.

part1=`dirname "$p"`
part2=`basename "$p"`
89
piokuc

Eine 100% ige bash-Methode, die sicher ist in Bezug auf Dateinamen, die Leerzeichen oder lustige Symbole enthalten (vorausgesetzt, inner_process.sh behandelt sie richtig, aber das ist eine andere Geschichte)

while read -r p; do
    [[ "$p" == */* ]] || p="./$p"
    inner_process.sh "${p%/*}" "${p##*/}"
done < list.txt

und es verzweigt nicht dirname und basename (in Subshells) für jede Datei.

Die Zeile [[ "$p" == */* ]] || p="./$p" ist hier nur für den Fall, dass $p keinen Schrägstrich enthält. Dann wird ./ vorangestellt.

Weitere Informationen zu den Symbolen % und ## finden Sie im Abschnitt Shell-Parametererweiterung im Bash-Referenzhandbuch .

12
gniourf_gniourf

Um auf die Kritik von @ gniourf_gniourf an der Antwort von @ piokuc zu antworten und sie kurz und einfach zu halten (wenn nicht so effizient)

part1=`dirname "$p"`
part2=`basename "$p"`

(Ich hätte in einem Kommentar geantwortet, aber das ist syntaktisch unmöglich.)

4
Gordon

Tolle Lösung aus dieser Quelle

p=/foo/bar/file1
path=$( echo ${p%/*} )
file=$( echo ${p##/*/} )

Dies funktioniert auch mit Leerzeichen im Pfad!

0
Phil Roggenbuck