Bash'de, VAR="/home/me/mydir/file.c"
nasıl, nasıl alabilirim "/home/me/mydir"
?
Bash'de, VAR="/home/me/mydir/file.c"
nasıl, nasıl alabilirim "/home/me/mydir"
?
Yanıtlar:
dirname
ve basename
yol bileşenlerini çıkarmak için aradığınız araçlardır:
$ VAR=/home/me/mydir/file.c
$ DIR=$(dirname "${VAR}")
$ echo "${DIR}"
/home/me/mydir
$ basename "${VAR}"
file.c
Bunlar dahili Bash komutları değildir, ancak POSIX standardının (bkz dirname
. basename
) Bir parçasıdır ve bu nedenle Bash çalıştıracak sistemlerin büyük çoğunluğunda mevcut olmalıdır.
$ export VAR=/home/me/mydir/file.c
$ export DIR=${VAR%/*}
$ echo "${DIR}"
/home/me/mydir
$ echo "${VAR##*/}"
file.c
basename
Ve ile bağımlılığı önlemek içindirname
İlgili bir notta, yalnızca dosya adına veya göreli yola sahipseniz, dirname
kendi başına yardımcı olmaz. Benim için cevap sona erdi readlink
.
fname='txtfile'
echo $(dirname "$fname") # output: .
echo $(readlink -f "$fname") # output: /home/me/work/txtfile
Daha sonra ikisini birleştirerek sadece dizini alabilirsiniz.
echo $(dirname $(readlink -f "$fname")) # output: /home/me/work
readlink -m "$fname"
verilen adı özyinelemede kurallı hale getirmek için kullanmalısınız
Hedef dosyaların sembolik bağlantı olmasını düşünüyorsanız, önce dosyayı kontrol edebilir ve orijinal dosyayı alabilirsiniz. Aşağıdaki if cümlesi size yardımcı olabilir.
if [ -h $file ]
then
base=$(dirname $(readlink $file))
else
base=$(dirname $file)
fi
Bununla oynuyordum ve bir alternatif buldum.
$ VAR=/home/me/mydir/file.c
$ DIR=`echo $VAR |xargs dirname`
$ echo $DIR
/home/me/mydir
Sevdiğim bölüm, ağacı yedeklemeyi uzatmanın kolay olmasıydı:
$ DIR=`echo $VAR |xargs dirname |xargs dirname |xargs dirname`
$ echo $DIR
/home