Wenn in Bash, wenn VAR="/home/me/mydir/file.c"
, wie komme ich "/home/me/mydir"
?
Wenn in Bash, wenn VAR="/home/me/mydir/file.c"
, wie komme ich "/home/me/mydir"
?
Antworten:
dirname
und basename
sind die Tools, nach denen Sie suchen, um Pfadkomponenten zu extrahieren:
$ VAR=/home/me/mydir/file.c
$ DIR=$(dirname "${VAR}")
$ echo "${DIR}"
/home/me/mydir
$ basename "${VAR}"
file.c
Sie sind nicht interne Bash Befehle , aber sie sind Teil des POSIX - Standard (siehe dirname
, basename
) und sollte so auf die überwiegende Mehrheit der Systeme zur Verfügung , die Bash laufen wird.
$ export VAR=/home/me/mydir/file.c
$ export DIR=${VAR%/*}
$ echo "${DIR}"
/home/me/mydir
$ echo "${VAR##*/}"
file.c
Um die Abhängigkeit von basename
und zu vermeidendirname
Wenn Sie nur den Dateinamen oder den relativen Pfad haben, dirname
hilft dies nicht. Für mich war die Antwort letztendlich readlink
.
fname='txtfile'
echo $(dirname "$fname") # output: .
echo $(readlink -f "$fname") # output: /home/me/work/txtfile
Sie können dann beide kombinieren, um nur das Verzeichnis zu erhalten.
echo $(dirname $(readlink -f "$fname")) # output: /home/me/work
readlink -m "$fname"
angegebenen Namen rekursiv
Wenn Sie möchten, dass Zieldateien ein symbolischer Link sind, können Sie dies zunächst überprüfen und die Originaldatei abrufen. Die folgende if-Klausel kann Ihnen helfen.
if [ -h $file ]
then
base=$(dirname $(readlink $file))
else
base=$(dirname $file)
fi
Ich habe damit gespielt und mir eine Alternative ausgedacht.
$ VAR=/home/me/mydir/file.c
$ DIR=`echo $VAR |xargs dirname`
$ echo $DIR
/home/me/mydir
Der Teil, den ich mochte, war, dass es einfach war, die Sicherung des Baums zu erweitern:
$ DIR=`echo $VAR |xargs dirname |xargs dirname |xargs dirname`
$ echo $DIR
/home