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:
dirnameve basenameyol 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
basenameVe ile bağımlılığı önlemek içindirname
İlgili bir notta, yalnızca dosya adına veya göreli yola sahipseniz, dirnamekendi 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