W Bash, VAR="/home/me/mydir/file.c"
jak mogę uzyskać "/home/me/mydir"
?
W Bash, VAR="/home/me/mydir/file.c"
jak mogę uzyskać "/home/me/mydir"
?
Odpowiedzi:
dirname
i basename
są to narzędzia, których szukasz do wyodrębnienia komponentów ścieżki:
$ VAR=/home/me/mydir/file.c
$ DIR=$(dirname "${VAR}")
$ echo "${DIR}"
/home/me/mydir
$ basename "${VAR}"
file.c
Nie są to wewnętrzne komendy Bash, ale są częścią standardu POSIX (patrz dirname
, basename
) i dlatego powinny być dostępne w zdecydowanej większości systemów, w których działa Bash.
$ export VAR=/home/me/mydir/file.c
$ export DIR=${VAR%/*}
$ echo "${DIR}"
/home/me/mydir
$ echo "${VAR##*/}"
file.c
Aby uniknąć zależności z basename
idirname
W powiązanej notatce, jeśli masz tylko nazwę pliku lub ścieżkę względną, dirname
samo w sobie nie pomoże. Dla mnie odpowiedź była ostateczna readlink
.
fname='txtfile'
echo $(dirname "$fname") # output: .
echo $(readlink -f "$fname") # output: /home/me/work/txtfile
Następnie możesz połączyć te dwa elementy, aby uzyskać tylko katalog.
echo $(dirname $(readlink -f "$fname")) # output: /home/me/work
readlink -m "$fname"
do kanonicznej rekurencyjnej podanej nazwy
Jeśli zależy ci na tym, aby pliki docelowe były linkami symbolicznymi, najpierw możesz to sprawdzić i uzyskać oryginalny plik. Poniższa klauzula if może ci pomóc.
if [ -h $file ]
then
base=$(dirname $(readlink $file))
else
base=$(dirname $file)
fi
Bawiłem się tym i wpadłem na alternatywę.
$ VAR=/home/me/mydir/file.c
$ DIR=`echo $VAR |xargs dirname`
$ echo $DIR
/home/me/mydir
Najbardziej podobało mi się to, że łatwo było rozszerzyć kopię zapasową drzewa:
$ DIR=`echo $VAR |xargs dirname |xargs dirname |xargs dirname`
$ echo $DIR
/home