Yanıtlar:
Readlink kullan :
readlink -f file.txt
brew install coreutils
sonragreadlink -f file.txt
Sanırım Linux kullanıyorsunuz.
Ben realpath
coreutils 8.15 adlı bir yardımcı program buldum .
realpath file.txt
/data/ail_data/transformed_binaries/coreutils/test_folder_realpath/file.txt
@ Styrofoam-fly ve @ arch-standton yorumlarına göre, realpath
tek başına dosya varlığını kontrol etmez, bunu çözmek için e
argümanı ekleyin :realpath -e file
realpath
2011'in sonunda coreutils readlink
realpath -e
değişken yoksa @styrofoamfly bir hata yazdırır.
Aşağıdaki genellikle hile yapar:
echo $(cd $(dirname "$1") && pwd -P)/$(basename "$1")
LOCAL_VARIABLE="filename.txt" && echo $(cd $(dirname "$LOCAL_VARIABLE") && pwd -P)/$(basename "$LOCAL_VARIABLE")
readlink
Dosya bir sembolik bağlantıysa çalışmaz, size sembolik bağın kendisi yerine sembolik bağlantının hedefini gösterir.
readlink
beni sembolik bağlantının ürettiği ana direkteye geri götürüyor, ama bu onu görmezden geliyor.
set .. && echo $(cd $(dirname "$1") && pwd -P)/$(basename "$1")
### Çıktı: / home / ravi / ..
Bunun daha kolay bir yolu olduğunu biliyorum , ama bulabilirsem karardım ...
jcomeau@intrepid:~$ python -c 'import os; print(os.path.abspath("cat.wav"))'
/home/jcomeau/cat.wav
jcomeau@intrepid:~$ ls $PWD/cat.wav
/home/jcomeau/cat.wav
find $PWD -type f | grep "filename"
veya
find $PWD -type f -name "*filename*"
find `pwd` -type file -name \*.dmp
Shift
Windows Gezgini'nde bir dosyayı basılı tutarak sağ tıklamanız size bir seçenek sunar Copy as Path
. Bu dosyanın tam yolunu panoya kopyalar.realpath yourfile
Başkalarının önerdiği gibi bir dosyanın tam yolunu almak için komutu kullanabilirsiniz .Bunun eski bir soru olduğunu biliyorum, ama sadece buradaki bilgilere eklemek için:
Linux komutu which
, bir komut dosyasının dosya yolunu bulmak için kullanılabilir, örn.
$ which ls
/bin/ls
Bu konuda bazı uyarılar var; lütfen https://www.cyberciti.biz/faq/how-do-i-find-the-path-to-a-command-file/ adresine bakın .
Mac, Linux, * nix üzerinde çalışır:
Bu size geçerli dizindeki tüm dosyaların alıntılanmış bir csv değerini verecektir:
ls | xargs -I {} echo "$(pwd -P)/{}" | xargs | sed 's/ /","/g'
Bunun çıktısı kolayca bir python listesine veya benzer bir veri yapısına kopyalanabilir.
Sen kullanabilirsiniz FPN (tam yol adı) komut:
% pwd
/Users/adamatan/bins/scripts/fpn
% ls
LICENSE README.md fpn.py
% fpn *
/Users/adamatan/bins/scripts/fpn/LICENSE
/Users/adamatan/bins/scripts/fpn/README.md
/Users/adamatan/bins/scripts/fpn/fpn.py
fpn
standart bir Linux paketi değil, ancak ücretsiz ve açık bir github projesi ve bir dakika içinde kurabilirsiniz .
pwd
Linux ve diğer Unix benzeri işletim sistemi ortamlarında tek başına iyi çalışmalıdır.
Bu işlevi kullanabilirsiniz. Dosya adı göreceli yol olmadan verilirse, geçerli çalışma dizininde bulunduğu varsayılır:
abspath() { old=`pwd`;new=$(dirname "$1");if [ "$new" != "." ]; then cd $new; fi;file=`pwd`/$(basename "$1");cd $old;echo $file; }
Kullanımı:
$ abspath file.txt
/I/am/in/present/dir/file.txt
Göreli yol ile kullanım:
$ abspath ../../some/dir/some-file.txt
/I/am/in/some/dir/some-file.txt
Dosya adındaki boşluklarla:
$ abspath "../../some/dir/another file.txt"
/I/am/in/some/dir/another file.txt
Benzer bir senaryoda, başka bir yerden bir cshell betiği başlatıyorum. Komut dosyasının yalnızca belirtilen dizinde çalışacak şekilde doğru mutlak yolunu ayarlamak için aşağıdaki kodu kullanıyorum:
set script_dir = `pwd`/`dirname $0`
$0
komut dosyasının nasıl yürütüldüğünü tam olarak dize saklar.
Komut dosyası aşağıdaki gibi başlatıldı eğer örneğin İçin: $> ../../test/test.csh
,
$script_dir
içerecektir/home/abc/sandbox/v1/../../test
./test.csh
/test/.
Mac OS X için, işletim sistemiyle birlikte gelen yardımcı programları ve yerine daha yeni bir coreutils sürümü kullandım. Bu, Mac'inizdeki ( readlink -f
dosyalara giden mutlak yol için) ve realpath
(dizinlere giden mutlak yol için ) gibi araçlara erişmenizi sağlar .
Homebrew sürümü, komut adının önüne bir 'G' (GNU Araçları için) ekler - böylece eşdeğerler greadlink -f FILE
ve olur grealpath DIRECTORY
.
Coreutils / GNU Tools'u Mac OS X üzerinde Homebrew aracılığıyla nasıl kuracağınıza ilişkin talimatlar bu StackExchange arcticle'ında bulunabilir .
Not: readlink -f
ve realpath
Un komutlarının Mac Unix kullanıcısı için kutunun dışında çalışması gerekir.
brew install coreutils
echo $(cd $(dirname "$1") && pwd -P)/$(basename "$1")
Bu ZeRemz en @ az neler olduğunu açıklamasıdır cevap :
"$1"
dirname "$1"
cd "$(dirname "$1")
bu göreceli direktifin içine&& pwd -P
ve bunun için mutlak yol elde edin. -P
seçeneği tüm sembollerden kaçınacaktır$(basename "$1")
echo
onuBu benim için gayet iyi çalıştı. Dosya sistemine (ihtiyaca göre bir pro / con) güvenmez, bu yüzden hızlı olacaktır; ve çoğu * NIX için taşınabilir olmalıdır. Geçirilen dizenin gerçekten başka bir dizine değil, PWD'ye göre olduğunu varsayar.
function abspath () {
echo $1 | awk '\
# Root parent directory refs to the PWD for replacement below
/^\.\.\// { sub("^", "./") } \
# Replace the symbolic PWD refs with the absolute PWD \
/^\.\// { sub("^\.", ENVIRON["PWD"])} \
# Print absolute paths \
/^\// {print} \'
}
Bu naif, ama POSIX uyumlu olmasını sağlamak zorundaydım. Dosyanın dizinine cd yazma izni gerektirir.
#!/bin/sh
if [ ${#} = 0 ]; then
echo "Error: 0 args. need 1" >&2
exit 1
fi
if [ -d ${1} ]; then
# Directory
base=$( cd ${1}; echo ${PWD##*/} )
dir=$( cd ${1}; echo ${PWD%${base}} )
if [ ${dir} = / ]; then
parentPath=${dir}
else
parentPath=${dir%/}
fi
if [ -z ${base} ] || [ -z ${parentPath} ]; then
if [ -n ${1} ]; then
fullPath=$( cd ${1}; echo ${PWD} )
else
echo "Error: unsupported scenario 1" >&2
exit 1
fi
fi
elif [ ${1%/*} = ${1} ]; then
if [ -f ./${1} ]; then
# File in current directory
base=$( echo ${1##*/} )
parentPath=$( echo ${PWD} )
else
echo "Error: unsupported scenario 2" >&2
exit 1
fi
elif [ -f ${1} ] && [ -d ${1%/*} ]; then
# File in directory
base=$( echo ${1##*/} )
parentPath=$( cd ${1%/*}; echo ${PWD} )
else
echo "Error: not file or directory" >&2
exit 1
fi
if [ ${parentPath} = / ]; then
fullPath=${fullPath:-${parentPath}${base}}
fi
fullPath=${fullPath:-${parentPath}/${base}}
if [ ! -e ${fullPath} ]; then
echo "Error: does not exist" >&2
exit 1
fi
echo ${fullPath}
Bunu kendinize kaydedebilir shell.rc
veya sadece konsola koyabilirsiniz
function absolute_path { echo "$PWD/$1"; }
alias ap="absolute_path"
misal:
ap somefile.txt
çıktı olacak
/home/user/somefile.txt
ap ../foobar.txt
verecek /home/user/../foobar.txt
, bu genellikle istediğiniz şey değil.
ap /tmp/foobar.txt
verecek /home/user//tmp/foobar.txt
, bu yanlış.
Zaten verilen yanıtların pek severim, ama şu sembolik ve bu şekilde göreli başvurular dahil olmak üzere bir dosyanın tam yolunu almak için özellikle bir senaryo dahilinde, bu gerçekten yararlı bulduk .
ve..
dirname `readlink -e relative/path/to/file`
Hangi file
kök yoldan itibaren tam yolunu döndürür . Bu, bir komut dosyasında kullanılabilir, böylece komut dosyası hangi yoldan çalıştığını bilir, bu da makinenin herhangi bir yerinde bulunabilecek bir depo klonunda yararlıdır.
basePath=`dirname \`readlink -e $0\``
Daha sonra ${basePath}
doğrudan diğer komut dosyalarına başvurmak için komut dosyalarındaki değişkeni kullanabilirim .
Bu yardımcı olur umarım,
Dave
find / -samefile file.txt -print
Aynı inode numarasına sahip dosyaya ait tüm bağlantıları bulur dosya.txt'daki olarak
-xdev
bayrak eklemek find
cihaz sınırlarını ("bağlama noktaları") aşmaktan kaçınır . (Ancak bu find
, aynı cihazdaki bir dizinde başlamazsa muhtemelen hiçbir şeyin bulunmasına neden olmaz.file.txt
)
find
Tek bir dosya sistemi nesnesi için birden çok yol bildirebileceğini unutmayın , çünkü bir Inode, muhtemelen farklı adlar kullanarak bile birden fazla dizin girişi ile bağlanabilir. Örneğin:
find /bin -samefile /bin/gunzip -ls
Çıktı olacak:
12845178 4 -rwxr-xr-x 2 root root 2251 feb 9 2012 /bin/uncompress
12845178 4 -rwxr-xr-x 2 root root 2251 feb 9 2012 /bin/gunzip
Bu hem Linux hem de Mac OSX ile çalışır.
echo $(pwd)$/$(ls file.txt)
Mac OS için, sadece bir dosyanın yolunu bulucuda almak istiyorsanız, dosyayı kontrol edin ve en alttaki "Hizmetler" e gidin. "Yolu kopyala" ve "yolu tam kopyala" dahil olmak üzere birçok seçeneğiniz vardır. Bunlardan birine tıklamak yolu panoya koyar.
Mac'te aşağıda belirtilen satır çalışmaları. Herhangi bir süslü çizgi eklemenize gerek yok.
> pwd filename
print working directory
"Readlink -f" yanında, sık kullanılan başka bir komut:
$find /the/long/path/but/I/can/use/TAB/to/auto/it/to/ -name myfile /the/long/path/but/I/can/use/TAB/to/auto/it/to/myfile $
Bu aynı zamanda konsoldaki tam yolu ve dosya adını verir
Konu Dışı: Bu yöntem mutlak değil , göreceli bağlantılar verir . readlink -f
Komut doğru olanıdır.
Aşağıdaki gibi bir işlev oluşturun (pwd ile bir dosyanın mutlak yolunu yansıtır ve dosyayı yolun sonuna ekler:
abspath() { echo $(pwd "$1")/"$1"; }
Artık herhangi bir dosya yolunu bulabilirsiniz:
abspath myfile.ext