Bir dosyanın tam yolu nasıl alınır?


719

Tam yolunu yazdırabilmemin kolay bir yolu var mı file.txt?

file.txt = /nfs/an/disks/jj/home/dir/file.txt

<command>

dir> <command> file.txt  

yazdırmalı

/nfs/an/disks/jj/home/dir/file.txt

Yanıtlar:


1190

Readlink kullan :

readlink -f file.txt

32
'-F' bunun içindir.
filmor


5
Sadece 10.9.2'de test edildi, iyi çalışıyor. hangi readlink / usr / local / opt / coreutils / libexec / gnubin / readlink readlink
sürüm

10
@ J0hnG4lt: bunun nedeni, homebrew ile coreutils kurmuş olmanız ve PATH'nızı önceden düzeltilmemiş ikili dosyaları gösterecek şekilde değiştirmiş olmanızdır. Coreutils kurmak, PATH'ı yalnız bırakmak ve "greadlink" kullanmak da işe yarayacaktır.
Tim Smith

35
MAC üzerinde: o zaman homebrewleri yüklemek brew install coreutilssonragreadlink -f file.txt
To kra

218

Sanırım Linux kullanıyorsunuz.

Ben realpathcoreutils 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, realpathtek başına dosya varlığını kontrol etmez, bunu çözmek için eargümanı ekleyin :realpath -e file


Cygwin ile çalışıyor (Nane 2.7.9 ile)
Scrambo

1
realpath2011'in sonunda coreutils readlink
repo'suna bağlıydı

2
realpath dosyanın varlığını kontrol etmez, sadece yolları çözer. Varolmayan bir dosyanın tam yolunu sormak bir hatayla sonuçlanmalıdır.
strafor sinek

4
Bağımsız realpath -edeğişken yoksa @styrofoamfly bir hata yazdırır.
Arch Stanton

77

Aşağıdaki genellikle hile yapar:

 echo $(cd $(dirname "$1") && pwd -P)/$(basename "$1")

Merhaba. Bu cevabı ihtiyacım için en iyi buldum. Komut satırı parametresi (yani $ 1) yerine yerel bir değişkeni nasıl kullanabileceğimi açıklayabilir misiniz
deeJ

1
LOCAL_VARIABLE="filename.txt" && echo $(cd $(dirname "$LOCAL_VARIABLE") && pwd -P)/$(basename "$LOCAL_VARIABLE")
stiemannkj1

7
@SopalajodeArrierez readlinkDosya bir sembolik bağlantıysa çalışmaz, size sembolik bağın kendisi yerine sembolik bağlantının hedefini gösterir.
qwertzguy

1
Bunu beğendim, çünkü readlinkbeni sembolik bağlantının ürettiği ana direkteye geri götürüyor, ama bu onu görmezden geliyor.
Sukhi

set .. && echo $(cd $(dirname "$1") && pwd -P)/$(basename "$1") ### Çıktı: / home / ravi / ..
Tom Hale

35

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

26
find $PWD -type f | grep "filename"

veya

find $PWD -type f -name "*filename*"

1
Benim için, Mac'te, bu çalıştı - $ pwd yerine -find `pwd` -type file -name \*.dmp
mrwaim

14

Dosyayla aynı dizindeyseniz:

ls "`pwd`/file.txt"

file.txtHedef dosya adınızla değiştirin .


9
ayrıca yapabilirsinecho $(pwd)/file.txt
Alex

12

Windows'ta:

  • ShiftWindows 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.

Linux'ta:

  • realpath yourfileBaşkalarının önerdiği gibi bir dosyanın tam yolunu almak için komutu kullanabilirsiniz .


4

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.


geçerli pwd yolunu yazdırır
Sand1512

Evet, virgül pwd'deki tüm dosyalar için tam yolları ayırdı, bir dosya için sadece 'ls' yerine ls 'dosyaadı' yap.
Bhargav Srinivasan

3

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

fpnstandart bir Linux paketi değil, ancak ücretsiz ve açık bir github projesi ve bir dakika içinde kurabilirsiniz .


1
Genel olarak, pwdLinux ve diğer Unix benzeri işletim sistemi ortamlarında tek başına iyi çalışmalıdır.
karolus

3

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

2

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_diriçerecektir/home/abc/sandbox/v1/../../test


bu oylama en kolay ve en alakalı olan oydu. Ancak ./test.csh/test/.
yazarsanız

2

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 -fdosyalara 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 FILEve 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 -fve realpathUn komutlarının Mac Unix kullanıcısı için kutunun dışında çalışması gerekir.


2
brew install coreutils
Kra

2
echo $(cd $(dirname "$1") && pwd -P)/$(basename "$1")

Bu ZeRemz en @ az neler olduğunu açıklamasıdır cevap :

  1. Bu komut dosyası bağımsız değişken olarak göreli yol al "$1"
  2. Sonra bu yolun dirname bölümünü alırız (dir veya dosyayı bu betiğe aktarabilirsiniz):dirname "$1"
  3. Sonra cd "$(dirname "$1")bu göreceli direktifin içine
  4. && pwd -P ve bunun için mutlak yol elde edin. -Pseçeneği tüm sembollerden kaçınacaktır
  5. Bundan sonra muten yola taban adı ekliyoruz :$(basename "$1")
  6. Son adım biz echoonu

1

Bu 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} \'
}

1

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}

1

Bunu kendinize kaydedebilir shell.rcveya sadece konsola koyabilirsiniz

function absolute_path { echo "$PWD/$1"; }
alias ap="absolute_path"

misal:

ap somefile.txt

çıktı olacak

/home/user/somefile.txt

3
Ama sonra ap ../foobar.txtverecek /home/user/../foobar.txt, bu genellikle istediğiniz şey değil.
bdesham

2
Ayrıca ap /tmp/foobar.txtverecek /home/user//tmp/foobar.txt, bu yanlış.
David

0

Genelde:

find `pwd` | grep <filename>

Alternatif olarak, yalnızca geçerli klasör için:

find `pwd` -maxdepth 1 | grep <filename>

hm neden nefret?
sjas

0

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 filekö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


-1
find / -samefile file.txt -print

Aynı inode numarasına sahip dosyaya ait tüm bağlantıları bulur dosya.txt'daki olarak

-xdevbayrak eklemek findcihaz 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 )

findTek 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

-1

Bu hem dosya hem de klasör için çalışır:

getAbsolutePath(){
    [[ -d $1 ]] && { cd "$1"; echo "$(pwd -P)"; } || 
    { cd "$(dirname "$1")" || exit 1; echo "$(pwd -P)/$(basename "$1")"; }
}


-1

Bu işi yapan başka bir Linux yardımcı programı:

fname <file>

-1

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.


-1

Mac'te aşağıda belirtilen satır çalışmaları. Herhangi bir süslü çizgi eklemenize gerek yok.

> pwd filename

6
Hayır, komutun adından da anlaşılacağı gibi, çalışma dizinini (dosya adı olmadan) yazdırırprint working directory
anilbey

-2
fp () {
PHYS_DIR=`pwd -P`
RESULT=$PHYS_DIR/$1
echo $RESULT | pbcopy
echo $RESULT
}

Metni panoya kopyalar ve metni terminal penceresinde görüntüler.

:)

(Kodun bir kısmını başka bir yığın taşması cevabından kopyaladım, ancak artık bu cevabı bulamıyorum)


-2

bulduğum en kolay yol

for i in `ls`; do echo "`pwd`/$i"; done

benim için iyi çalışıyor


-2

Mac OSX'te aşağıdaki adımları uygulayın:

  1. cd hedef dosyanın dizinine.
  2. Aşağıdaki terminal komutlarından birini yazın.
terminal
ls "`pwd`/file.txt"
echo $(pwd)/file.txt
  1. değiştirmek file.txtGerçek dosya adınızla .
  2. Basın Enter

-3

"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 -fKomut doğru olanıdır.


-3

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.