कैसे एक फ़ाइल का पूरा रास्ता bash में प्राप्त करने के लिए?


23

मैं एक फ़ाइल के लिए पूर्ण पथ प्राप्त करना आसान तरीका चाहूंगा। मैं वर्तमान में यह टाइप करता हूं:

echo `pwd`/file.ext

इसे छोटा करने की कोशिश में, मैंने एक उबासी उर्फ:

alias fp='echo `pwd`/'

लेकिन अब अगर मैं टाइप करता हूं fp file.ext, तो एक जगह है जो /और के बीच दिखाई देती है file.ext

क्या ऐसी आज्ञा पहले से मौजूद है, और मैं इसे याद कर रहा हूं? यदि नहीं, तो मैं इस तरह के उपनाम या समारोह को कैसे बना सकता हूं?

जवाबों:


31

लिनक्स सिस्टम पर, आपको readlinkस्थापित GNU कोरुटिल्स प्रोजेक्ट से होना चाहिए और यह कर सकते हैं:

readlink -f file.ext

डेबियन / ubuntu सिस्टम में रियलपथ उपयोगिता स्थापित हो सकती है जो " /bin/readlink -fकोरुटिल्स पैकेज में ज्यादातर कार्यक्षमता प्रदान करती है ।"


readlink -f(या realpath, जो संगतता के लिए रखी गई एक पुरानी उपयोगिता है) अतिरिक्त रूप से सभी प्रतीकात्मक लिंक का विस्तार करेगा, जो आवश्यक रूप से वांछनीय नहीं है।
गाइल्स का SO- दुष्ट होना बंद हो '

8
fyi: macosx पर काम नहीं करता है।
अकीरा

अपने मैक पर, मैंने होमब्रॉ का उपयोग करके कोरुटिल स्थापित किया है और इसमें शामिल हैं realpath
डग हैरिस

7

pwdकमांड के बजाय , PWDवैरिएबल का उपयोग करें (यह POSIX में भी है):

fp () {
  case "$1" in
    /*) printf '%s\n' "$1";;
    *) printf '%s\n' "$PWD/$1";;
  esac
}

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


हो सकता है कि यह आपकी पसंद हो लेकिन यह फ़ंक्शन नई पंक्ति का उत्पादन नहीं करेगा।
cYrus

इस दृष्टिकोण में केवल शेल-बिलिन का उपयोग करने का लाभ है, जो बाहरी बायनेरिज़ को कॉल करने की तुलना में तेज़ है। आपको इस तथ्य को थोड़ा और स्पष्ट करना चाहिए।
अकीरा

4

अपने प्रश्न का उत्तर देने के लिए जो आप अभी उपयोग करते हैं:

उपनाम उस स्थिति में फैलता है जहां आप अभी टाइप कर रहे हैं। आपने टाइप किया:

% fp<SPACE>file.ext

यह बन जाता है

% echo `pwd`<SPACE>file.exe

आप इससे बचने के लिए किसी फ़ंक्शन का उपयोग कर सकते हैं:

function fp() {
    echo `pwd`/"$1"
}

आप हमेशा की तरह उपयोग कर सकते हैं:

% fp file.ext

आपको चर और कमांड प्रतिस्थापन के आसपास दोहरे उद्धरण चिह्नों की आवश्यकता है:echo "`pwd`/$1"
गाइल्स का SO- रोकना बुराई है '

@ गिल्स: किन परिस्थितियों में?
अकीरा

2
@akira: हमेशा दोहरे उद्धरण चिह्नों का उपयोग करें जब तक कि आप विस्तार के परिणाम को ग्लोबिंग पैटर्न के रूप में नहीं मानते हैं और ग्लोबिंग के परिणामों को शब्दों में विभाजित किया जाना है। यहां आप एक एकल फ़ाइल नाम का निर्माण कर रहे हैं, इसलिए दोहरे उद्धरण चिह्नों की आवश्यकता है (अपने कार्य को किसी फ़ाइल *में निर्देशिका के साथ किसी अन्य फ़ाइल वाली फ़ाइल के साथ आज़माएँ )।
गिल्स एसओ- बुराई को रोकना '

' ' मेरे मामले में zsh (मेरे मामले में zsh) से ग्लोबेड है और इससे पहले कि वे फ़ंक्शन को हिट करते हैं। fp *पैदावार /tmp/4cc3ea0c1b34bसमारोह के लिए पहले paramete thats के बाद। अन्य पैरामीटर निर्देशिका में अन्य फ़ाइलें होंगे। जैसे ही मेरे पास एक फाइल होती है, जिसे '' 'फंक्शन अभी भी उम्मीद के मुताबिक काम करता है, इसे "*" या * या *
akira

बैश "बुरा" एक है जैसा कि यहां लगता है, बैश पैदावार जो आप उल्लेख कर रहे हैं।
अकीरा

3

आप उपयोग कर सकते हैं:

realpath file.ext

मेरे पास वह नहीं है। वह कहां से आता है?
frabjous

@ एफ्रबजस: यह डेबियन और डेरिवेटिव के लिए विशिष्ट है, और यह केवल तभी स्थापित किया जाएगा जब आपने इसे अनुरोध किया है या इस पर निर्भर करता है।
गाइल्स का SO- दुष्ट होना बंद हो '

मैं आर्क का उपयोग कर रहा हूं। यह डेबियन आधारित नहीं है, लेकिन AUR में वैसे भी इसके लिए एक पैकेज है। यकीन है कि यह स्थापित करने के लायक नहीं है अगर मेरे पास पहले से ही है, हालांकि।
frabjous

खैर, यह एक विकल्प है; या आप एक समारोह पर विचार कर सकते हैं, गिल्स का जवाब देखें । वैसे भी जो उस वास्तविक उपयोग पर निर्भर करता है जिसे आप उसके साथ करना चाहते हैं (मैं उत्सुक हूं)।
cYrus

@frabjous: आपने यह निर्दिष्ट नहीं किया कि आप किस सिस्टम पर हैं, लेकिन यदि यह एप्टीट्यूड-आधारित पैकेज मैनेजर (डेबियन, उबंटू, मिंट, आदि) का उपयोग करता है, तो आप यह apt-cache search realpathप्रकट करने के लिए टाइप कर सकते हैं कि कोरुटिल्स और प्लेन ओएल ' रियलपथ पैकेज दोनों इसमें सम्‍मिलित हैं। फिर आप इसे स्थापित करने के लिए टाइप sudo apt-get install realpath(या coreutils) कर सकते हैं।
माइकल स्कीपर

1

से /programming//a/3915420/5795941

यह एकमात्र तरीका है जो मुझे स्वीकार्य है। Realpath और readlink जैसे लिंक का विस्तार नहीं करता है और इसे करने का शास्त्रीय तरीका है जिसे मैंने सभी पर देखा है।

#! /bin/sh
echo "$(cd "$(dirname "$1")"; pwd -P)/$(basename "$1")"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.