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:
dirnamei basenamesą 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 basenameidirname
W powiązanej notatce, jeśli masz tylko nazwę pliku lub ścieżkę względną, dirnamesamo 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