किसी फ़ाइल का पूर्ण पथ कैसे प्राप्त करें?


717

क्या कोई आसान तरीका है जिससे मैं पूरा रास्ता प्रिंट कर सकता हूँ file.txt?

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

<command>

dir> <command> file.txt  

छपना चाहिए

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

जवाबों:


1187

रीडलिंक का उपयोग करें :

readlink -f file.txt

32
यही '-फ' के लिए है।
फिल्म


5
बस 10.9.2 पर परीक्षण किया गया, ठीक काम करता है। जिसमें रीडिंकल / यूएसआर / लोकल / ऑप्ट / कोरुटिल्स / लिबासेकिन / ग्नुबिन / रीडलिंक रीडलिंक-version वाचलिंक (GNU कोरुटिल्स) 8.22
J0hnG4lt

10
@ J0hnG4lt: ऐसा इसलिए है क्योंकि आपने होमब्रॉव के साथ कोरुटिल स्थापित किए हैं और अपने पैथ को बदल दिया है ताकि उपसर्गित बायनेरिज़ को इंगित किया जा सके। Coreutils को स्थापित करना, PATH को अकेला छोड़ देना, और "greadlink" का उपयोग करना भी काम करेगा।
टिम स्मिथ

35
मैक पर: homebrew तो स्थापित brew install coreutilsतोgreadlink -f file.txt
करने के लिए क्रा

217

मुझे लगता है कि आप लिनक्स का उपयोग कर रहे हैं।

मुझे realpathकोरुटिल्स 8.15 में एक उपयोगिता मिली ।

realpath file.txt
/data/ail_data/transformed_binaries/coreutils/test_folder_realpath/file.txt

@ स्टायरोफोम-फ्लाई और @ आर्क-स्टैंडटन टिप्पणियों के अनुसार, realpathअकेले फ़ाइल अस्तित्व की जांच नहीं करता है, इस eतर्क को हल करने के लिए :realpath -e file


साइबरविन के साथ काम करता है (मिनिटेट 2.7.9 के साथ)
स्क्रैम्बो

1
realpath2011 के कोरुटील्स रेपो अंत के लिए प्रतिबद्ध था, रिलीज़ 8.15 जनवरी 2012 में किया गया था, मैंने readlinkमार्च 2011 में सवाल ( सुझाव के साथ ) का जवाब दिया :)
फिल्म अभिनेता

2
realpath फ़ाइल के अस्तित्व की जाँच नहीं करता है, यह सिर्फ पथों को हल करता है। मौजूदा फ़ाइल के पूर्ण पथ के लिए पूछने पर परिणाम में त्रुटि होनी चाहिए।
स्टायरोफोम

4
realpath -eयदि तर्क मौजूद नहीं है, तो @styrofoamfly एक त्रुटि प्रिंट करता है।
आर्क स्टेंटन

76

निम्नलिखित आमतौर पर चाल है:

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

हैलो। मुझे अपनी आवश्यकता के लिए यह उत्तर सबसे अच्छा लगा। क्या आप बता सकते हैं कि कमांड लाइन पैरामीटर (यानी $ 1) के बजाय मैं स्थानीय चर का उपयोग कैसे कर सकता हूं
deeJ

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

7
@SopalajodeArrierez क्योंकि readlinkफ़ाइल एक सिमलिंक है तो काम नहीं करता है, यह आपको सिम्पीनल के बजाय सिम्लिंक का लक्ष्य दिखाएगा।
क्वाटर्जेगुई

1
मुझे यह पसंद है, क्योंकि readlinkमुझे मूल डायर वापस ले जाता है जहां से प्रतीकात्मक लिंक उत्पन्न होता है, लेकिन यह इसे अनदेखा करता है।
सुखी

set .. && echo $(cd $(dirname "$1") && pwd -P)/$(basename "$1") ### आउटपुट: / घर / रवि / ..
टॉम हेल

35

मुझे पता है कि वहाँ एक आसान तरीका है कि यह है, लेकिन अगर मैं इसे पा सकता हूँ ...

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


14

यदि आप फ़ाइल के समान निर्देशिका में हैं:

ls "`pwd`/file.txt"

file.txtअपने लक्ष्य फ़ाइल नाम के साथ बदलें ।


9
आप यह भी कर सकते हैंecho $(pwd)/file.txt
एलेक्स

12

विंडोज पर:

  • Shiftविंडोज एक्सप्लोरर में एक फाइल पर होल्डिंग और राइट क्लिक करने से आपको ऑप्शन मिलता है Copy as Path। यह फ़ाइल के पूर्ण पथ को क्लिपबोर्ड पर कॉपी कर देगा।

लिनक्स पर:

  • आप realpath yourfileकिसी फ़ाइल के पूर्ण पथ को दूसरों द्वारा सुझाए गए अनुसार प्राप्त करने के लिए कमांड का उपयोग कर सकते हैं।

4

मुझे पता है कि यह अब एक पुराना सवाल है, लेकिन यहाँ जानकारी में जोड़ने के लिए:

लिनक्स कमांड whichका उपयोग कमांड फाइल के फाइलपथ को खोजने के लिए किया जा सकता है, अर्थात

$ which ls
/bin/ls

इसके लिए कुछ संकेत हैं; कृपया देखें https://www.cyberciti.biz/faq/how-do-i-find-the-path-to-a-command-file/


5
यह उत्तर बहुत विशिष्ट है, ओपी कमांड खोजने के बारे में नहीं है।
AL

4

मैक, लिनक्स, * निक्स पर काम करता है:

यह आपको वर्तमान dir में सभी फ़ाइलों का एक उद्धृत csv देगा:

ls | xargs -I {} echo "$(pwd -P)/{}" | xargs | sed 's/ /","/g'

इस के आउटपुट को आसानी से अजगर सूची या किसी समान डेटा संरचना में कॉपी किया जा सकता है।


वर्तमान pwd पथ प्रिंट
Sand1512

हाँ, कॉमा ने pwd में सभी फ़ाइलों के लिए पूर्ण पथ अलग कर दिए हैं, एक फ़ाइल के लिए सिर्फ 'ls' के बजाय केवल 'फ़ाइल नाम' करें।
भार्गव श्रीनिवासन

3

आप fpn (पूर्ण पथ नाम) स्क्रिप्ट का उपयोग कर सकते हैं :

% 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एक मानक लिनक्स पैकेज नहीं है, लेकिन यह एक स्वतंत्र और खुला गिटब प्रोजेक्ट है और आप इसे एक मिनट में सेट कर सकते हैं


1
आमतौर पर, pwdअपने आप ही लिनक्स और अन्य यूनिक्स जैसे ओएस वातावरण पर ठीक चलना चाहिए।
करोलस

3

आप इस फ़ंक्शन का उपयोग कर सकते हैं। यदि फ़ाइल का नाम रिश्तेदार पथ के बिना दिया जाता है, तो यह माना जाता है कि वर्तमान कार्यशील निर्देशिका में मौजूद है:

abspath() { old=`pwd`;new=$(dirname "$1");if [ "$new" != "." ]; then cd $new; fi;file=`pwd`/$(basename "$1");cd $old;echo $file; }

उपयोग:

$ abspath file.txt
/I/am/in/present/dir/file.txt

रिश्तेदार पथ के साथ उपयोग:

$ abspath ../../some/dir/some-file.txt
/I/am/in/some/dir/some-file.txt

फ़ाइल नाम में रिक्त स्थान के साथ:

$ abspath "../../some/dir/another file.txt"
/I/am/in/some/dir/another file.txt

2

इसी तरह के परिदृश्य में, मैं किसी अन्य स्थान से एक शिल्‍प लिपि शुरू कर रहा हूं। स्क्रिप्ट के सही निरपेक्ष पथ को सेट करने के लिए ताकि यह केवल निर्दिष्ट निर्देशिका में चले, मैं निम्नलिखित कोड का उपयोग कर रहा हूं:

set script_dir = `pwd`/`dirname $0`

$0 सटीक स्ट्रिंग को संग्रहीत करता है कि स्क्रिप्ट को कैसे निष्पादित किया गया था।

जैसे अगर स्क्रिप्ट इस तरह शुरू किया गया था के लिए: $> ../../test/test.csh, $script_dirशामिल होंगे/home/abc/sandbox/v1/../../test


इसके लिए मतदान किया गया क्योंकि यह सबसे आसान और सबसे प्रासंगिक है। हालाँकि यदि आप टाइप ./test.cshकरते हैं तो आपके पास एक रास्ता होगा/test/.
vinyll

2

मैक ओएस एक्स के लिए, मैंने उन उपयोगिताओं को प्रतिस्थापित किया जो ऑपरेटिंग सिस्टम के साथ आते हैं और उन्हें कोरुटिल के एक नए संस्करण के साथ बदल दिया। यह आपको अपने मैक पर readlink -f( जैसे फ़ाइलों के लिए पूर्ण पथ) और realpath(निर्देशिकाओं के लिए पूर्ण पथ ) जैसे उपकरणों तक पहुंचने की अनुमति देता है ।

Homebrew संस्करण आदेश नाम के सामने संलग्न कर देता है एक 'जी' (जीएनयू उपकरण के लिए) - तो समकक्ष बनने greadlink -f FILEऔर grealpath DIRECTORY

होमब्रेव के माध्यम से मैक ओएस एक्स पर कोरुटिल्स / जीएनयू उपकरण कैसे स्थापित करें, इसके निर्देश इस स्टैकएक्सचेंज आर्कटिक में मिल सकते हैं ।

NB: गैर-मैक यूनिक्स उपयोगकर्ताओं के लिए कमांड readlink -fऔर realpathकमांड बॉक्स से बाहर काम करना चाहिए।


2
brew install coreutils
क्रै

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

यह @ ZeRemz के उत्तर पर क्या हो रहा है, इसकी व्याख्या है :

  1. इस लिपि को तर्क के रूप में सापेक्ष मार्ग मिलता है "$1"
  2. फिर हमें उस पथ का dirname भाग मिलता है (आप इस स्क्रिप्ट में dir या फ़ाइल पास कर सकते हैं):dirname "$1"
  3. तो फिर हम cd "$(dirname "$1")इस रिश्तेदार dir में
  4. && pwd -Pऔर इसके लिए पूर्ण मार्ग प्राप्त करें। -Pऑप्शन सभी सिम्बलिंक से बच जाएगा
  5. उसके बाद हम बेसमेन को पूर्ण पथ पर ले जाते हैं:$(basename "$1")
  6. अंतिम चरण के रूप में हम echoइसे

1

यह मेरे लिए बहुत अच्छा काम किया। यह फ़ाइल सिस्टम (आवश्यकता के आधार पर एक समर्थक / कांग्रेस) पर भरोसा नहीं करता है, इसलिए यह तेज़ होगा; और, यह किसी भी * NIX के लिए पोर्टेबल होना चाहिए। यह मानता है कि पारित स्ट्रिंग वास्तव में पीडब्ल्यूडी के सापेक्ष है न कि कुछ अन्य निर्देशिका के लिए।

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

यह अनुभवहीन है, लेकिन मुझे इसे पोसिक्स के अनुरूप बनाना था। फ़ाइल की निर्देशिका में सीडी की अनुमति की आवश्यकता है।

#!/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}

0

आम तौर पर:

find `pwd` | grep <filename>

वैकल्पिक रूप से, केवल वर्तमान फ़ोल्डर के लिए:

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

नफरत क्यों?
sjas

0

मुझे पहले से दिए गए जवाबों में से कई पसंद हैं, लेकिन मुझे यह वास्तव में उपयोगी लगा है, विशेष रूप से एक स्क्रिप्ट के भीतर एक फ़ाइल का पूरा रास्ता पाने के लिए, जिसमें निम्न सहानुभूति और रिश्तेदार संदर्भ जैसे कि .और..

dirname `readlink -e relative/path/to/file`

जो fileरूट के रास्ते से आगे का पूरा रास्ता वापस कर देगा । यह एक स्क्रिप्ट में इस्तेमाल किया जा सकता है ताकि स्क्रिप्ट को पता हो कि वह किस रास्ते से चल रहा है, जो कि रिपॉजिटरी क्लोन में उपयोगी है जो किसी मशीन पर कहीं भी स्थित हो सकता है।

basePath=`dirname \`readlink -e $0\``

फिर मैं ${basePath}अपनी लिपियों में चर का उपयोग सीधे अन्य लिपियों को संदर्भित करने के लिए कर सकता हूं।

उम्मीद है की यह मदद करेगा,

डेव


0

आप इसे अपने में सेव कर सकते हैं shell.rcया सिर्फ कंसोल में रख सकते हैं

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

उदाहरण:

ap somefile.txt

उत्पादन होगा

/home/user/somefile.txt

3
लेकिन फिर ap ../foobar.txtदे देंगे /home/user/../foobar.txt, जो आम तौर पर आप नहीं चाहते हैं।
bdesham

2
भी ap /tmp/foobar.txtदेंगे /home/user//tmp/foobar.txt, जो गलत है।
डेविड ने

-1
find / -samefile file.txt -print

फ़ाइल के सभी लिंक फ़ाइल के रूप में एक ही इनकोड संख्या के साथ पाएंगे

-xdevध्वज जोड़ने से findडिवाइस की सीमाओं ("माउंट पॉइंट") को पार करने से बचना होगा । (लेकिन यह संभवत: कुछ भी नहीं मिलेगा, अगर findयह उसी डिवाइस पर एक निर्देशिका में शुरू नहीं होता है file.txt)

ध्यान दें कि findएकल फाइल सिस्टम ऑब्जेक्ट के लिए कई पथों की रिपोर्ट कर सकते हैं, क्योंकि एक इनोड को एक से अधिक निर्देशिका प्रविष्टि द्वारा लिंक किया जा सकता है, संभवतः विभिन्न नामों का उपयोग करके भी। उदाहरण के लिए:

find /bin -samefile /bin/gunzip -ls

उत्पादन होगा:

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

यह फ़ाइल और फ़ोल्डर दोनों के लिए काम करेगा:

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


-1

एक और लिनक्स उपयोगिता, जो यह काम करती है:

fname <file>

-1

मैक ओएस के लिए, यदि आप खोजक में किसी फ़ाइल का पथ प्राप्त करना चाहते हैं, तो नियंत्रण फ़ाइल पर क्लिक करें, और नीचे "सेवाएँ" तक स्क्रॉल करें। आपको "प्रतिलिपि पथ" और "पूर्ण पथ की प्रतिलिपि" सहित कई विकल्प मिलते हैं। इनमें से किसी एक पर क्लिक करने से क्लिपबोर्ड पर रास्ता आ जाता है।


-1

नीचे लाइन कार्यों में उल्लिखित मैक में। किसी भी फैंसी लाइनों को जोड़ने की आवश्यकता नहीं है।

> pwd filename

6
नहीं, यह केवल कार्यशील निर्देशिका (फ़ाइल नाम के बिना) को प्रिंट करता है जैसा कि कमांड के नाम से पता चलता हैprint working directory
अनिलबाई

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

अपने क्लिपबोर्ड पर पाठ की प्रतिलिपि बनाता है और टर्मिनल विंडो पर पाठ प्रदर्शित करता है।

:)

(मैंने एक और स्टैक ओवरफ्लो उत्तर से कुछ कोड कॉपी किए लेकिन वह उत्तर अब और नहीं मिल सकता है)


-2

सबसे आसान तरीका जो मुझे मिला है

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

ये मेरे लिए अच्छी तरह से काम करता है


-2

Mac OSX में, निम्न चरण करें:

  1. cd लक्ष्य फ़ाइल की निर्देशिका में।
  2. या तो निम्न टर्मिनल कमांड टाइप करें।
टर्मिनल
ls "`pwd`/file.txt"
echo $(pwd)/file.txt
  1. file.txtअपने वास्तविक फ़ाइल नाम से बदलें ।
  2. दबाएँ Enter

-3

"रीडलिंक -f" के अलावा, एक और सामान्य रूप से प्रयुक्त कमांड:

$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
$

यह कंसोल पर पूर्ण पथ और फ़ाइल नाम भी देता है

ऑफ-टॉपिक: यह विधि केवल सापेक्ष लिंक देती है, निरपेक्ष नहीं। readlink -fआदेश सही एक है।


-3

नीचे की तरह एक फ़ंक्शन बनाएं (pwd के साथ फ़ाइल के पूर्ण पथ को echoes करता है और पथ के अंत में फ़ाइल जोड़ता है:

abspath() { echo $(pwd "$1")/"$1"; }

अब आप किसी भी फ़ाइल पथ को पा सकते हैं:

abspath myfile.ext
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.