Yanıtlar:
readlink
Yardımcı programı kullanabilirsiniz -f
:
-f, --canonicalize
canonicalize by following every symlink in every component of the given name recursively; all but the last component must exist
Örneğin GNU coreutils ve FreeBSD kullananlar gibi bazı dağıtımlar, realpath(1)
temelde yalnızca realpath(3)
aynı şeyi yapan ve yapan bir yardımcı programla birlikte gelir .
readlink
ne de realpath
Solaris ve özellikle HP-UX, -.
brew install coreutils
apple.stackexchange.com/a/69332/23040 ve tüm standart Mac CLI araçlarını yeni yüklenen GNU eşdeğerlerine yönlendiren adımı atmak istemiyorsanız, hemen arayın greadlink
.
Taşınabilir, PWD
değişken kabuk tarafından geçerli dizinin mutlak bir konumuna ayarlanır. Bu yolun herhangi bir bileşeni sembolik bir bağlantı olabilir.
case $f in
/*) absolute=$f;;
*) absolute=$PWD/$f;;
esac
Ortadan kaldırmak .
ve ..
aynı zamanda dosyayı içeren dizine geçmek ve $PWD
orada edinin :
if [ -d "$f" ]; then f=$f/.; fi
absolute=$(cd "$(dirname -- "$f")"; printf %s. "$PWD")
absolute=${absolute%?}
absolute=$absolute/${f##*/}
Sembolik bağları izlemenin taşınabilir bir yolu yoktur. Bir dizine giden bir yolunuz varsa, çoğu sistemde $(cd -- "$dir" && pwd -P 2>/dev/null || pwd)
sembolik bağ kullanmayan bir yol sağlar, çünkü sembolik bağları izleyen kabukları uygulama eğilimindedir pwd -P
(“fiziksel” için “P”).
Bazı sendikalar bir dosyaya “fiziksel” yol yazdırmak için bir yardımcı program sağlar.
readlink -f
, FreeBSD ≥8.3, NetBSD ≥4.0 ve OpenBSD’leri de 2.2.realpath
(bazı Linux sistemlerinde de var ve BusyBox'ta).Perl varsa, Cwd
modülü kullanabilirsiniz .
perl -MCwd -e 'print Cwd::realpath($ARGV[0])' path/to/file
pwd
( $(cd -- "$dir" && pwd -P 2>/dev/null | pwd)
) içine sokuyorsun ? Stdin'i umursamıyor gibi gözüküyor.
||
Mı pwd
ihtiyaçlarınız için uygun? Geçerli dizinin mutlak yolunu verir. Ya da belki istediğin şey realpath () .
alister
ve rss67
de bu makalede en istikrarlı uyumlu ve en kolay yolu tanıtmak. Daha önce bundan daha iyi bir yol görmedim.
RELPATH=./../
cd $RELPATH
ABSPATH=`pwd`
Orijinal konumuna geri dönmek istiyorsanız,
ORGPATH=`pwd`
RELPATH=./../
cd $RELPATH
ABSPATH=`pwd`
cd $ORGPATH
veya
RELPATH=./../
cd $RELPATH
ABSPATH=`pwd`
cd -
Keşke bu yardımcı olsaydı. Bu benim için en büyük çözümdü.
ABSPATH=$(cd -- "$RELPATH" && pwd)
. İkame etrafındaki (tırnak boşluğu ve globbing karakterleri içeriyorsa kırılmayacak şekilde) çift tırnak işaretlerini ve --
(yolun başlaması durumunda -
) not alın. Ayrıca bu yalnızca dizinler için çalışır ve sembolik bağları istenildiği gibi kurallaştırmaz. Daha fazla ayrıntı için cevabımı gör.
Buradaki diğer cevaplar iyiydi ancak ihtiyaçlarım için yetersizdi. Komut dosyalarımda herhangi bir makinede kullanabileceğim bir çözüme ihtiyacım vardı. Benim çözümüm, ihtiyacım olan senaryolardan çağırabildiğim bir kabuk betiği yazmaktı.
#!/bin/sh
if [ $# -eq 0 ] || [ $# -gt 2 ]; then
printf 'Usage: respath path [working-directory]\n' >&2
exit 1
fi
cantGoUp=
path=$1
if [ $# -gt 1 ]; then
cd "$2"
fi
cwd=`pwd -P` #Use -P option to account for directories that are actually symlinks
#Handle non-relative paths, which don't need resolution
if echo "$path" | grep '^/' > /dev/null ; then
printf '%s\n' "$path"
exit 0
fi
#Resolve for each occurrence of ".." at the beginning of the given path.
#For performance, don't worry about ".." in the middle of the path.
while true
do
case "$path" in
..*)
if [ "$cwd" = '/' ]; then
printf 'Invalid relative path\n' >&2
exit 1
fi
if [ "$path" = '..' ]; then
path=
else
path=`echo "$path" | sed 's;^\.\./;;'`
fi
cwd=`dirname $cwd`
;;
*)
break
;;
esac
done
cwd=`echo "$cwd" | sed 's;/$;;'`
if [ -z "$path" ]; then
if [ -z "$cwd" ]; then
cwd='/'
fi
printf '%s\n' "$cwd"
else
printf '%s/%s\n' "$cwd" "$path"
fi
Bu çözüm, taşınabilirlik için Bourne Kabuğu için yazılmıştır. Bunu "respath.sh" adında bir komut dosyasında buldum.
Bu script şu şekilde kullanılabilir:
respath.sh '/path/to/file'
Ya da böyle
respath.sh '/relative/path/here' '/path/to/resolve/relative/to'
Komut, ikinci argümandaki yolu başlangıç noktası olarak kullanarak, ilk argümandaki yolu çözer. Yalnızca ilk argüman sağlanırsa, komut dosyası mevcut çalışma dizininize göre yolu çözer.
pwd
yerleşik ve desteklemez -P
(Bourne kabuğu do POSIX kabukları gibi işleme mantıksal $ PWD uygulamak vermedi).
cd -P --
de, 1. argümanın bazılarını içermesi durumunda kullanmalısınız ..
case
olmalı . ..|../*)
..*
dirname $cwd
Diğer herkesin yanıtına saygı duyuyorum, aşağıdaki işlevi linux / MAC OSX arasında her yerde bulduğum diğerlerine göre çok daha kolay ve taşınabilir buldum. Birine yardım edebilir.
#!/usr/bin/bash
get_absolute_path(){
file_path=`pwd $1`
echo "$file_path/$1"
}
#to assign to a variable
absolute_path=$(get_absolute_path "file.txt")
echo $absolute_path
A değişkeninin bir yol adı sakladığını varsayın (a = "neyse")
1. Potansiyel boşluk içeren yol için:
c=$(grep -o " " <<< $a | wc -l); if (( $c > "0" )); then a=$(sed 's/ /\\ /g' <<< $a); fi
2. Asıl soru için, yani yolu mutlak hale dönüştürmek: readlink , aşağıdaki gibi kullanılabilen sembolik link içeriğini alabilir. (not readlink -f
mükemmel olurdu, ama -f FORMATS'ın anlamına gelir , en azından Mac OS X bash'ta kullanılamaz .)
if [[ $(readlink $a) == "" ]]; then a=$(cd $a; pwd); else a=$(cd $(readlink $a); pwd); fi
3. Sadece öğrenilen pwd -P
içinde man pwd
: -P "etmektir (bütün sembolik bağlantılar çözüldü) fiziksel Geçerli çalışma dizini görüntüler ve dolayısıyla"
if (( $(grep -o " " <<< $a | wc -l) > "0" )); then a=$(sed 's/ /\\ /g' <<< $a); fi; a=$(cd $a; pwd -P)
de çalışacak.
Sonuç: Her iki gereksiniminizi de karşılamak için 1'i 2 ile birleştirin , ancak boşluk içeren yol adları daha özlü bir şekilde 3 ele alınır .
-f
Anahtar Mac OS X (en az 10.8.5 itibariyle) üzerinde mevcut değil.-f
Anahtar olmadan sadece bir hata kodu verir.