কোনও ফাইলের পরম পাথ মুদ্রণের জন্য বাশ / ফিশ কমান্ড


448

প্রশ্ন: আমি যে কোন ফাইলটি ফিড করব তার নিখুঁত পথটি মুদ্রণের জন্য কি একটি সাধারণ শ / বশ / জেডএস / ফিশ / ... কমান্ড রয়েছে?

ব্যবহারের ক্ষেত্রে: আমি ডিরেক্টরির মধ্যে আছি /a/bএবং আমি ফাইলের সম্পূর্ণ পাথ মুদ্রণ করতে চান cযাতে আমি সহজে অন্য প্রোগ্রাম সেটিকে আটকে দিতে পারেন কম্যান্ড-লাইন করুন: /a/b/c। সহজ, তবু এটি করার জন্য একটি সামান্য প্রোগ্রাম সম্ভবত দীর্ঘ পথগুলি পরিচালনা করার ক্ষেত্রে আমার 5 বা ততোধিক সেকেন্ড পরে বাঁচাতে পারে, যা শেষ পর্যন্ত যুক্ত হয়। সুতরাং এটি আমাকে অবাক করে দেয় যে আমি এটি করার জন্য কোনও স্ট্যান্ডার্ড ইউটিলিটিটি খুঁজে পাচ্ছি না - আসলেই কিছুই নেই?

এখানে একটি নমুনা বাস্তবায়ন, abspath.py:

#!/usr/bin/python
# Author: Diggory Hardy <diggory.hardy@gmail.com>
# Licence: public domain
# Purpose: print the absolute path of all input paths

import sys
import os.path
if len(sys.argv)>1:
    for i in range(1,len(sys.argv)):
        print os.path.abspath( sys.argv[i] )
    sys.exit(0)
else:
    print >> sys.stderr, "Usage: ",sys.argv[0]," PATH."
    sys.exit(1)

আমি যুক্তি দিয়ে বলব যে @ ডেনিস উইলিয়ামসনের উত্তর (-ম বিকল্পটি ব্যবহার করে) (সাধারণত) আরও পোর্টেবল হওয়ার জন্য এবং অস্তিত্বহীন ফাইলগুলির সাথে কাজ করার জন্য সর্বোত্তম।
টিটিটি

বা ফ্লিমের উত্তর; উভয়ই ভাল সমাধান। ব্যানিয়ার্স অবশ্য আমার মূল প্রশ্নের উত্তর দেয় সবচেয়ে ভাল।
ধর্মি

3
ওএসএক্স ব্যবহারকারীগণ: এই উত্তরটি দেখুন
ইয়ান

উত্তর:


560

ব্যবহার করে দেখুন realpath

$ realpath example.txt
/home/username/example.txt

133
+1, খুব সুন্দর প্রোগ্রাম। তবে মনে রাখবেন যে এটি একটি বাহ্যিক কমান্ড (শেল বিল্ট-ইন নয়) এবং প্রতিটি সিস্টেমে ডিফল্টরূপে উপস্থিত নাও হতে পারে, আপনাকে এটি ইনস্টল করার প্রয়োজন হতে পারে। ডেবিয়ানে এটি একই নামের পৃথক প্যাকেজে বাস করে।
রোমান চ্যাপলিয়াক


1
@ ফ্লিম: এটি কিছু আপেক্ষিক পথের পরে আপনাকে একটি বৈধ পথ দেবে। আপনি যদি ফাইল অস্তিত্ব সম্পর্কে জানতে চান তবে অন্য পরীক্ষার মতো অন্য সরঞ্জামটি ব্যবহার করুন।
বেনিয়ামিন ব্যানিয়ার

14
@ ডালিন: কোর্টিল ইনস্টল করার চেষ্টা করুন। বাইনারিটির নাম গ্রালপাথ।
টনি পেনিয়া-আলবা

5
এই সরঞ্জামটি জিএনইউ কোর্টিলস 8.15 (2012 সালে) এ চালু হয়েছিল, সুতরাং এটি বেশ নতুন।
মারবু

317

readlinkপ্রতীকী লিঙ্কগুলি সমাধান করবে যা চেষ্টা করুন :

readlink -e /foo/bar/baz

50
আমি '-e' এর পরিবর্তে '-f' ব্যবহার করব যাতে আমরা অস্তিত্বহীন ফাইলের পরম পথ দেখতে পারি।
hluk

5
এটি আমার কাছে সর্বাধিক সহজ দেখাচ্ছে, পোর্টেবল হওয়ার পরেও। রিডলিঙ্ক হ'ল gnu কোরিউটিলের বন্দর, সুতরাং এটি কিছু এম্বেড থাকা ব্যতীত প্রায় কোনও লিনাক্স বিতরণে ইনস্টল করা হবে।
ক্যাটিফাইভ

14
এটি আমার কাছে মনে হয় এটি -mব্যবহারের সেরা বিকল্প।
ম্যাট জয়েনার

1
@ ডালিন: /usr/bin/readlinkম্যাভেরিক্সে। অথবা আপনি কি বোঝাতে চেয়েছিলেন যে ওএস এক্স এ এই বিকল্পগুলি পাওয়া যায় না? এটি একটি স্তব্ধ বিএসডি সংস্করণ বলে মনে হচ্ছে ...: পি
আইকনোক্লাস্ট

14
@ আইকনোক্লাস্ট ওএসএক্স-এ এই বিকল্পগুলি উপলভ্য নয় এবং বিএসডি ম্যানপেজ অনুসারে readlink: only the target of the symbolic link is printed. If the given argument is not a symbolic link, readlink will print nothing and exit with an errorসুতরাং ওপেনএক্সে রিডলিংক এই উদ্দেশ্যে কাজ করবে না
স্নোরিংফ্রাগ

256
#! /bin/sh
echo "$(cd "$(dirname "$1")"; pwd -P)/$(basename "$1")"

8
সমস্ত জিনিস উদ্ধৃত করতে ভুলবেন না। যদি আপনি বুঝতে না পারেন তবে কোনও ফাইলটিতে আপনার প্রোগ্রামটি চেষ্টা করে দেখুন a b(a এবং b এর মধ্যে দুটি ফাঁকা জায়গা, SO এর মধ্যে একটি খায়)।
রোমান চ্যাপলিয়াক

1
"/" এটি "///" তে পরিণত হয়
জর্জ

34
এখনও অবধি একমাত্র পসিক্স সলিউশন যার জন্য আপনাকে এক্সিকিউটেবল লিখতে এবং সংকলন করতে হবে না যেহেতু রিডলিঙ্ক এবং রিয়েলপথ পজিক্স নয়
সিরো সান্তিলি 29 冠状 病 六四 事件 法轮功

25
আমি ওএস এক্সে function realpath { echo $(cd $(dirname $1); pwd)/$(basename $1); }নিজেকে একটি realpathকমান্ড (বর্তমানে গৃহীত উত্তর) তৈরি করতাম Thanks ধন্যবাদ!
জেমস বেডফোর্ড

1
আমি স্ক্রিপ্টগুলির জন্য লগ ফাইলের নাম সংজ্ঞায়িত করতে এই পদ্ধতিটি ব্যবহার করেছি:LOG=$(echo $(cd $(dirname $0); pwd)/$(basename $0 .sh).log)
DrStrangepork

83

আপনার সিস্টেমে যা ইনস্টল থাকতে পারে readlinkএবং realpathনা সে সম্পর্কে ভুলে যান ।

উপরে ডগবানের উত্তরটি প্রসারিত করা এখানে একটি ফাংশন হিসাবে প্রকাশ করা হয়েছে:

#!/bin/bash
get_abs_filename() {
  # $1 : relative filename
  echo "$(cd "$(dirname "$1")" && pwd)/$(basename "$1")"
}

আপনি এটির পরে এটি ব্যবহার করতে পারেন:

myabsfile=$(get_abs_filename "../../foo/bar/file.txt")

কিভাবে এবং কেন এটি কাজ করে?

সমাধানটি এই সত্যটিকে কাজে লাগায় যে বাশ অন্তর্নির্মিত pwdকমান্ডটি তত্ক্ষণাত যুক্তি ছাড়াই চলমান বর্তমান ডিরেক্টরিটির পরম পাথটি মুদ্রণ করবে।

আমি এই সমাধানটি কেন পছন্দ করি?

এটি পোর্টেবল এবং এটির প্রয়োজন হয় না readlinkবা realpathপ্রদত্ত লিনাক্স / ইউনিক্স ডিস্ট্রোয়ের ডিফল্ট ইনস্টলটিতে প্রায়শই উপস্থিত থাকে না।

দির না থাকলে কী হবে?

উপরে প্রদত্ত ফাংশনটি ব্যর্থ হবে এবং প্রদত্ত ডিরেক্টরি পথটি উপস্থিত না থাকলে stderr এ মুদ্রণ করবে। এটি আপনি যা চান তা নাও হতে পারে। আপনি এই পরিস্থিতিটি পরিচালনা করতে ফাংশনটি প্রসারিত করতে পারেন:

#!/bin/bash
get_abs_filename() {
  # $1 : relative filename
  if [ -d "$(dirname "$1")" ]; then
    echo "$(cd "$(dirname "$1")" && pwd)/$(basename "$1")"
  fi
}

এখন পিতা-মাতার ডায়ারগুলির উপস্থিতি না থাকলে এটি খালি স্ট্রিংটি ফিরিয়ে দেবে।

আপনি কীভাবে '..' বা 'ট্রেলিং পরিচালনা করবেন। ইনপুট?

ঠিক আছে, এটি সেই ক্ষেত্রে একটি নিখুঁত পথ দেয় তবে একটি ন্যূনতমতম পথ নয়। এটির মতো দেখাবে:

/Users/bob/Documents/..

আপনি যদি '..' সমাধান করতে চান তবে আপনাকে স্ক্রিপ্টটি তৈরি করতে হবে:

get_abs_filename() {
  # $1 : relative filename
  filename=$1
  parentdir=$(dirname "${filename}")

  if [ -d "${filename}" ]; then
      echo "$(cd "${filename}" && pwd)"
  elif [ -d "${parentdir}" ]; then
    echo "$(cd "${parentdir}" && pwd)/$(basename "${filename}")"
  fi
}

দুর্দান্ত ফাংশন, তবে সম্ভবত আপনি প্রশ্নটি বুঝতে পারেন নি। আমি ইন্টারেক্টিভ ব্যবহারের জন্য কিছু চাইছিলাম, স্ক্রিপ্টগুলি নয়।
ধরদি

3
আমি যুক্ত করতে চাই realpathযা কোরিউটিলস প্যাকেজ থেকে এসেছে, যার মধ্যে সরঞ্জামগুলিও রয়েছে যেমন who, touchবা cat। এটি জিএনইউ সরঞ্জামগুলির বেশ স্ট্যান্ডার্ড সেট, সুতরাং আপনি নিশ্চিত হয়ে উঠতে পারেন যে এটি প্রায় কোনও লিনাক্স ভিত্তিক মেশিনে ইনস্টল করা আছে hatএটি বলেছে, আপনি ঠিক বলেছেন: এটিতে 2 টি সমস্যা রয়েছে: i) আপনি সম্ভবত এটি ডিফল্ট ইনস্টল অন এটিকে মিস করবেন নন জিএনইউ ইউনিক্স সিস্টেম (ওপেনবিএসডি এর মতো) ii) এই সরঞ্জামগুলি 8.15 সংস্করণে প্রবর্তিত হয়েছিল (সুতরাং এটি 2012 থেকে অনেকটা নতুন), সুতরাং আপনি এটি দীর্ঘমেয়াদী স্থিতিশীল সিস্টেমে মিস করবেন (আরএইচএল 6 এর মতো)।
মারবু

1
ভাল, কমপক্ষে মনে হচ্ছে কন্টিনিয়াম অ্যানালিটিক্স ( অ্যানাকোন্ডা পাইথন বিতরণ প্রস্তুতকারীরা ) এই উত্তরটি পছন্দ করেছেন। এটি তাদের "অ্যাক্টিভেট" স্ক্রিপ্টে (এখানে ফিরে একটি লিঙ্কের সাথে সংযোগের সাথে) প্রয়োগ করা হয়েছে , যা কনডা সরঞ্জাম দ্বারা নির্মিত ভার্চুয়াল পরিবেশ সক্রিয় করতে ব্যবহৃত হয়। তাই ... ভাল!
wjv

1
এটি কেবল ডিরেক্টরিগুলির জন্য কাজ করে (যেহেতু অন্য কোনও নেই) এবং ".." এবং "সাথে সামলাতে পারে না। : আমার উত্তর যে সবকিছু হ্যান্ডেল করা হয় দেখুন stackoverflow.com/a/23002317/2709
আলেকজান্ডার Klimetschek

3
@ মারবু রিয়েলপথ উবুন্টু ১৪.০৪ বা ডিবিয়ান হুইজে উপস্থিত নেই। সময়ের সাথে সাথে এটি কিছুটা স্ট্যান্ডার্ড হয়ে উঠতে পারে তবে এটি এখন নেই not এছাড়াও নোট করুন যে ওপি লিনাক্স বা জিএনইউ সম্পর্কে কিছু বলেনি। এর চেয়ে ব্যাশ বেশি ব্যবহৃত হয়।
mc0e

76
$ readlink -m FILE
/path/to/FILE

এটি এর চেয়ে ভাল readlink -e FILEবা realpathকারণ, ফাইলটি না থাকলেও এটি কাজ করে।


খুশী হলাম। এটি এমন ফাইল / ডিরেক্টরিতেও কাজ করে যা বিদ্যমান আছে তবে তারা কোনও সংকেত নয়।
চুপচাপ

আমার কাছে ওএস এক্স ১০.৯ (ম্যাভারিক্স) এ রিডলিঙ্ক পাওয়া যায়, সুতরাং এটি এখানে অবশ্যই সেরা উত্তর।
কেনেথ হোস্ট

6
@ কেনেথহস্ট: -mবিকল্পটি মাভেরিক্সে উপলভ্য নয়।
আইকনোক্লাস্ট

2
অবশ্যই এটি একটি ডিফল্ট ওএসএক্স ইনস্টলেশনে নেই।
ফ্রান মারজোয়া

লিনাক্সে কাজ করে (সেন্টোস) আপনাকে ধন্যবাদ, কারণ রিয়েলপ্যাথ এটির জন্য উপস্থিত ছিল না
jimh

65

পরম পাথ রূপান্তরকারী শেল ফাংশন সম্পর্কিত এই আপেক্ষিক পথ

  • কোন উপযোগ প্রয়োজন (শুধু cdএবং pwd)
  • ডিরেক্টরি এবং ফাইলের জন্য কাজ করে
  • হ্যান্ডলগুলি ..এবং.
  • দির বা ফাইলের নামগুলিতে স্পেস পরিচালনা করে
  • ফাইল বা ডিরেক্টরি বিদ্যমান থাকার প্রয়োজন
  • প্রদত্ত পথে কিছু না থাকলে কিছুই প্রত্যাবর্তন করে না
  • ইনপুট হিসাবে পরম পাথ পরিচালনা করে (এগুলি মূলত পাস করে)

কোড:

function abspath() {
    # generate absolute path from relative path
    # $1     : relative filename
    # return : absolute path
    if [ -d "$1" ]; then
        # dir
        (cd "$1"; pwd)
    elif [ -f "$1" ]; then
        # file
        if [[ $1 = /* ]]; then
            echo "$1"
        elif [[ $1 == */* ]]; then
            echo "$(cd "${1%/*}"; pwd)/${1##*/}"
        else
            echo "$(pwd)/$1"
        fi
    fi
}

নমুনা:

# assume inside /parent/cur
abspath file.txt        => /parent/cur/file.txt
abspath .               => /parent/cur
abspath ..              => /parent
abspath ../dir/file.txt => /parent/dir/file.txt
abspath ../dir/../dir   => /parent/dir          # anything cd can handle
abspath doesnotexist    =>                      # empty result if file/dir does not exist
abspath /file.txt       => /file.txt            # handle absolute path input

দ্রষ্টব্য: এটি nolan6000 এবং bsingh এর উত্তরগুলির উপর ভিত্তি করে তৈরি করা হয়েছে, তবে ফাইলের কেসটি ঠিক করে।

আমি আরও বুঝতে পারি যে আসল প্রশ্নটি একটি বিদ্যমান কমান্ড লাইন ইউটিলিটি সম্পর্কে। তবে যেহেতু এটি ন্যূনতম নির্ভরতা থাকতে চাইছে এমন শেল স্ক্রিপ্টগুলি সহ স্ট্যাকওভারফ্লোতে প্রশ্ন হিসাবে দেখা যাচ্ছে, তাই আমি এই স্ক্রিপ্ট সমাধানটি এখানে রেখেছি, তাই আমি এটি পরে খুঁজে পেতে পারি :)


ধন্যবাদ। ওএসএক্সের সাথে আমি যাচ্ছি
গ্রেগ

এটি স্পেস সহ ডিরেক্টরিগুলির জন্য কাজ করে না, অর্থাত্: $ abspath 'a b c/file.txt'কারণ আর্গুমেন্টটি cdউদ্ধৃত হয়নি। এটি থেকে উত্তরণের জন্য, পুরো যুক্তিটি উদ্ধৃত না করে echo(এই উদ্ধৃতিগুলির জন্য কোনও কারণ আছে?) কেবল পথের যুক্তিই উদ্ধৃত করুন। অর্থাত প্রতিস্থাপন echo "$(cd ${1%/*}; pwd)/${1##*/}"সঙ্গে echo $(cd "${1%/*}"; pwd)/${1##*/}
জর্জে

@ জর্জ লক্ষ করার জন্য ধন্যবাদ, আমি এটি স্থির করেছি।
আলেকজান্ডার ক্লিমেটসেক

1
আমি কয়েক ডজন অর্ধ-কাকযুক্ত সমাধানগুলি দেখেছি এবং এটি অবশ্যই সবচেয়ে সংক্ষিপ্ত এবং নির্ভুল বাশ-কেবল সমাধান হিসাবে প্রতীয়মান। আপনি পারা পাতলা এটি আরও বেশি প্রতিস্থাপন echo "$(cd "$1"; pwd)"সঙ্গে (cd "$1"; pwd)। এখানে প্রতিধ্বনির দরকার নেই।
ছয়

@ সিক্স ট্রু, আপডেট হয়েছে। ধনুর্বন্ধনী ( ... )এখনও প্রয়োজন, সুতরাং cdএকটি সাব-শেলের মধ্যে ঘটে, কারণ আমরা কোনও কলকারীদের জন্য ওয়ার্কিং ডিরেক্টরিটি পরিবর্তন করতে চাই না abspath
আলেকজান্ডার ক্লিমেটসেক 27'15

24

findকমান্ড সাহায্য করতে পারে

find $PWD -name ex*
find $PWD -name example.log

প্যাটার্নের সাথে মিলে যাওয়া নামের সাথে বর্তমান ডিরেক্টরিতে বা নীচে সমস্ত ফাইল তালিকাভুক্ত করে। আপনি যদি কিছু ফলাফল পান (উদাহরণস্বরূপ কয়েকটি ফাইলের সাথে গাছের নীচের দিকের ডিরেক্টরি) পান তবে আপনি এটিকে সহজ করতে পারবেন

find $PWD

আমি এটি সোলারিস 10 এ ব্যবহার করি, যার উল্লেখযোগ্য অন্যান্য ইউটিলিটিগুলি নেই।


1
আমি প্রথম পড়ার উপর এই মন্তব্য ছাঁটাই না; এখানে মূল বক্তব্যটি হ'ল যদি আপনি অনুসন্ধান কমান্ডের জন্য একটি নিখুঁত পাথ দেন তবে এটি আউটপুটটির ফলশ্রুতিতে পরম পথে পাবে। সুতরাং $ পিডাব্লুডির ব্যবহার হ'ল আপনি যেখানে থাকবেন তার পরম পথ এটি আপনি নিখুঁত হিসাবে আউটপুট পাবেন।
simbo1905

4
আপনি যদি নির্ভর করেন তবে আপনি PWDকেবল ব্যবহার করতে পারবেন $PWD/$filename
জনি

-ম্যাক্সডেপথ ১ ব্যবহার করে এই পদ্ধতির উন্নতি করা যেতে পারে Also এছাড়াও আপনি কীভাবে এটি ব্যবহার করেন তার উপর নির্ভর করে উদ্ধৃতি - সম্ভাব্য সুরক্ষা সম্পর্কিত সমস্যাগুলি সম্পর্কে ভুলে যাবেন না।
এমসি 0

1
@ জনি: $ পিডাব্লুডি / $ ফাইলের নাম ব্যর্থ হয় যদি $ ফাইলের নাম ইতিমধ্যে পরম হয়।
এমসি 0

যদি ফাইল নাম "./filename.txt" হিসাবে দেওয়া হয় (অগ্রণী বিন্দু এবং স্ল্যাশ সহ) এটি ব্যর্থ হয়।
মার্ক স্টসবার্গ

15

আপনার যদি রিডলিংক বা রিয়েলপথ ইউটিলিটি না থাকে তবে আপনার নিম্নলিখিত ফাংশনটি ব্যবহার করতে পারেন যা বাশ এবং জেডএসে কাজ করে (বাকিগুলি সম্পর্কে নিশ্চিত নয়)।

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

এটি অস্তিত্বহীন ফাইলগুলির জন্যও কাজ করে (যেমন পাইথন ফাংশন করে os.path.abspath)।

দুর্ভাগ্যক্রমে abspath ./../somefileবিন্দু থেকে মুক্তি পান না।


1
আমার কাছে পোর্টেবল লাগছে। অন্যদিকে, উদাহরণস্বরূপ একটি ফাইললাইনে একটি নতুন লাইন থাকবে break
রোমান চ্যাপলিয়াক

1
আরও উন্নত করার জন্য, প্রতিস্থাপন echo "$1"সঙ্গে printf "%s\n" "$1"(দ্বিতীয় প্রতিধ্বনি সঙ্গে একই)। echoএর যুক্তিগুলির মধ্যে ব্যাকস্ল্যাশ ব্যাখ্যা করতে পারে।
রোমান চ্যাপলিয়াক

আবার, আপনি ঠিক বলেছেন! সত্যিই, zsh এ ইকো কমান্ডের ব্যবহার বাশ থেকে আলাদা।
hluk

1
কঠোরভাবে বলতে গেলে, ইকো-এর POSIX আচরণের অধীনে যদি আর্গুমেন্টগুলিতে ব্যাকস্ল্যাশ থাকে ef যাইহোক, এটি এক্সএসআই এক্সটেনশনের অধীনে সংজ্ঞায়িত হয়েছে (যথা প্রতিধ্বনির সাথে পালানোর ক্রমগুলি ব্যাখ্যা করা উচিত)। তবে বাশ এবং জেডএসএইচএস উভয়ই
পসিক্স

দুঃখিত, তবে আমি বিন্দুটি দেখতে পাচ্ছি না। আমি ইতিমধ্যে আরও বৈশিষ্ট্যযুক্ত একটি স্ক্রিপ্ট হিসাবে একটি উত্তর সরবরাহ করেছি যা এটি এবং এটি শেল স্ক্রিপ্টের মধ্যে ব্যবহার করার প্রয়োজন হয় না।
ধর্মি

10

এখানে একটি zsh- কেবল ফাংশন যা আমি এর সংক্ষিপ্ততার জন্য পছন্দ করি। এটি 'এ' সম্প্রসারণ মডিফায়ার ব্যবহার করে - zshexpn (1) দেখুন।

realpath() { for f in "$@"; do echo ${f}(:A); done }

বাহ এটি একটি মার্জিত সমাধান !!
শেলফিশ

6

সাধারণত কোন ধরনের জিনিস আছে যেমন একটি ফাইল (এই বিবৃতি মানে সাধারণভাবে একটির বেশি, তাই নির্দিষ্ট আর্টিকল ব্যবহার করা যেতে পারে যে উপযুক্ত নয়)। একটি হ'ল এমন কোনও পথ যা "/" মূল থেকে শুরু হয় এবং কার্যক্ষম ডিরেক্টরি থেকে অস্পষ্টতা ছাড়াই একটি ফাইল ডিজাইন করে ((উদাহরণস্বরূপ উইকিপিডিয়া দেখুন )। absolute pathabsolute path

relative pathএমন একটি পথ যা অন্য ডিরেক্টরি থেকে শুরু করে ব্যাখ্যা করা। এটি যদি relative pathকোনও অ্যাপ্লিকেশন দ্বারা চালিত হয় তবে এটি প্রয়োজনীয় ডিরেক্টরি হতে পারে (যদিও প্রয়োজনীয় নয়)। যখন এটি কোনও ডিরেক্টরিতে একটি প্রতীকী লিঙ্কে থাকে তখন এটি সাধারণত সেই ডিরেক্টরিটির সাথে সম্পর্কিত হওয়ার উদ্দেশ্যে তৈরি হয় (যদিও ব্যবহারকারীর মনে অন্য ব্যবহার থাকতে পারে)।

সুতরাং একটি নিখুঁত পাথ হ'ল মূল ডিরেক্টরি সম্পর্কিত একটি পাথ।

একটি পাথ (পরম বা আপেক্ষিক) প্রতীকী লিঙ্কগুলি থাকতে পারে এবং নাও থাকতে পারে। যদি এটি না হয় তবে এটি লিঙ্কিং কাঠামোর পরিবর্তনের জন্য কিছুটা দুর্বল, তবে এটি প্রয়োজনীয়ভাবে প্রয়োজন বা এমনকি আকাঙ্ক্ষিতও নয়। কিছু লোক কল canonical path(বা canonical file nameবা resolved path) একটি বলে absolute pathযার মধ্যে সমস্ত প্রতীকী লিঙ্কগুলি সমাধান করা হয়েছে, অর্থাৎ তারা যেখানেই লিঙ্ক করে তার পথে প্রতিস্থাপিত হয়েছে। কমান্ডগুলি realpathএবং readlinkউভয়ই একটি প্রাসঙ্গিক পথের সন্ধান করে, তবে কেবল realpathপ্রতীকী লিঙ্কগুলি সমাধান করার জন্য বিরক্ত না করেই একটি পরম পথ পাওয়ার জন্য একটি বিকল্প রয়েছে (বিভিন্ন দিকের পাথ পেতে বিভিন্ন বিকল্পের পাশাপাশি কিছু ডিরেক্টরিের সাথে নিখুঁত বা আপেক্ষিক)।

এটি বেশ কয়েকটি মন্তব্যের জন্য কল করে:

  1. প্রতীকী লিঙ্কগুলি কেবল তখনই সমাধান করা যেতে পারে যাগুলির সাথে লিঙ্ক করার কথা তারা ইতিমধ্যে তৈরি হয়ে গেছে, যা অবশ্যই সবসময় হয় না। কমান্ডগুলি realpathএবং এর readlinkজন্য অ্যাকাউন্টে বিকল্প রয়েছে।
  2. কোনও পাথের ডিরেক্টরি পরে একটি প্রতীকী লিঙ্কে পরিণত হতে পারে যার অর্থ পথ আর আর নেই canonical। সুতরাং ধারণাটি সময় (বা পরিবেশ) নির্ভর।
  3. এমনকি আদর্শ ক্ষেত্রে, যখন সমস্ত প্রতীকী লিঙ্কগুলি সমাধান করা যেতে পারে, তখনও canonical pathদুটি কারণে একটি ফাইলের একাধিক থাকতে পারে :
    • ফাইলযুক্ত পার্টিশনটি roবেশ কয়েকটি মাউন্ট পয়েন্টে একযোগে মাউন্ট করা থাকতে পারে ।
    • ফাইলটির শক্ত লিঙ্ক থাকতে পারে যার অর্থ মূলত ফাইলটি বিভিন্ন ডিরেক্টরিতে বিদ্যমান।

অতএব, এমনকি আরও সীমাবদ্ধ সংজ্ঞা সহ canonical path, একটি ফাইলের বেশ কয়েকটি প্রচলিত পথ থাকতে পারে। এর অর্থ canonicalহ'ল কোয়ালিফায়ার কিছুটা অপর্যাপ্ত কারণ এটি সাধারণত স্বতন্ত্রতার ধারণাটি বোঝায়।

এটি বাশ- তে অন্য অনুরূপ প্রশ্নের উত্তরে এই বিষয়ের একটি সংক্ষিপ্ত আলোচনা প্রসারিত করে : আপেক্ষিক প্রদত্ত পরম পথটি পুনরুদ্ধার করুন

আমার উপসংহারটি এটি realpathআরও ভাল ডিজাইন করা এবং এর চেয়ে অনেক বেশি নমনীয় readlink। এর একমাত্র ব্যবহারটি readlinkcoveredেকে দেওয়া হয় realpathনা বিকল্পটি কল ব্যতীত প্রতীকী লিঙ্কটির মান ফেরত দেওয়া।


আমি হতাশ হয়ে পড়তে আপত্তি করি না, তবে কেন বুঝতে পারি যে কেন আমি প্রযুক্তিগতভাবে বা সাইটের যথাযথ অনুশীলন হিসাবে বিবেচিত বলে কিছু শিখতে পারি। ভাল ... কমপক্ষে এটি স্থানীয় সমাজবিজ্ঞানটি আরও ভালভাবে বোঝার জন্য আমাকে মেটা স্ট্যাক ওভারফ্লোতে রেজিস্ট্রেশন করতে প্ররোচিত করেছিল । আমি এটি সুপারিশ না। - তবুও, আমার উত্তরের অনুপযুক্ততা সম্পর্কে কারও মতামত থাকলে আমি আগ্রহী।
বাবু

1
(ক) প্রশ্নটির 2 + 1/2 বছর আগে থেকেই একটি বৈধ উত্তর রয়েছে, (খ) আপেক্ষিক পথের সাথে সম্পর্কিত (একক) পরম পথ রয়েছে (যা আমি চাইছিলাম), যদিও আপনার মতো কোনও ফাইলের কাছে নাও হতে পারে চিহ্নিত করা. realpathবনাম সম্পর্কে readlinkবা এমনকি প্রতীকী লিঙ্ক সম্পর্কে কোনও মন্তব্য বিটিডাব্লু আমি যা চেয়েছিলাম তার থেকে উদ্বৃত্ত।
ধরদি

1
দ্বিতীয় মন্তব্য: সংক্ষিপ্ত উত্তরগুলি দীর্ঘ বক্তৃতাগুলির চেয়ে প্রায়শই বেশি কার্যকর। স্ট্যাক ওভারফ্লো সাধারণত নির্দিষ্ট প্রশ্ন জিজ্ঞাসা করার জন্য ব্যবহৃত হয়।
ধরদি

5
1- যদিও দীর্ঘকাল ধরে একটি প্রশ্নের বৈধ উত্তর রয়েছে তার অর্থ এই নয় যে এটি বন্ধ রয়েছে। প্রশ্নগুলি শুধুমাত্র ব্যক্তিগত ব্যবহারের জন্য নয়। প্রকৃতপক্ষে, প্রতিক্রিয়ার জন্য ব্যাজ রয়েছে যা বৈধতাযুক্ত উত্তরের চেয়ে বেশি ভোট সংগ্রহ করে। এবং নতুন সরঞ্জামগুলির সাহায্যে সময়ের সাথে "সেরা" উত্তরটি পরিবর্তন হতে পারে। অনেকে ওয়েব অনুসন্ধানের মাধ্যমে অ্যাক্সেস করা পুরানো উত্তর ব্যবহার করেন।
বাবু

1
2 - আপনি জেদ করেছেন যে আপেক্ষিক পথের সাথে সম্পর্কিত (একক) পরম পথ রয়েছে । যদিও আপনি অনুমান করছেন যে আপনি "অনুরূপ" বলতে কী বোঝাতে চাইছেন, অর্থাত্ কোনও প্রদত্ত রূপান্তরগুলির সেট থেকে মূল থেকে প্রাপ্ত একটি পথ, আপনার বক্তব্যটি এখনও ভুল। একটি অনন্য "প্রাসঙ্গিক" ক্যানোনিকাল পথ আছে। শব্দটি canonicalরূপান্তরগুলির একটি সংখ্যার সাথে সম্পর্কিত এই স্বতন্ত্রতার সাথে স্পষ্টভাবে বোঝায়। তবে, উদাহরণস্বরূপ, / dev / cdrom একটি পুরোপুরি ভাল পরম পাথ, যদিও এটি আসলে / dev / sr0 এর লিঙ্ক। উভয়ই একই ডিভাইসে নির্দেশ করে। আমার মূল উত্তরটি প্রাসঙ্গিক ওয়েব নিবন্ধে নির্দেশিত।
বাবু

5

দ্য dogbane উত্তর বিবরণ কি আসছে সঙ্গে

#! /bin/sh
echo "$(cd "$(dirname "$1")"; pwd)/$(basename "$1")"

ব্যাখ্যা:

  1. এই স্ক্রিপ্টটি যুক্তি হিসাবে আপেক্ষিক পথ পায় get "$1"
  2. তাহলে আমরা পাই সেই পথটির ডেরনাম অংশ পেয়েছি (আপনি এই স্ক্রিপ্টে দির বা ফাইল দুটি পাস করতে পারেন):dirname "$1"
  3. তারপর আমরা cd "$(dirname "$1") এই আপেক্ষিক dir এর মধ্যে প্রবেশ এবং pwdশেল কমান্ড চালিয়ে এর জন্য পরম পাথ পেতে পারি
  4. এর পরে আমরা সংযোজন করি বেসনেমকে পরম পথে যুক্ত করি:$(basename "$1")
  5. চূড়ান্ত পদক্ষেপ হিসাবে আমরা echoএটা

2

ডিরেক্টরিগুলির dirnameজন্য ট্রিপড হয়ে যায় ../এবং ফিরে আসে./

nolan6000 এর ক্রিয়াকলাপটি এটি সংশোধন করতে সংশোধন করা যেতে পারে:

get_abs_filename() {
  # $1 : relative filename
  if [ -d "${1%/*}" ]; then
    echo "$(cd ${1%/*}; pwd)/${1##*/}"
  fi
}

1
তাই আপনাকে স্বাগতম! ছোট পরিবর্তন এবং মন্তব্যগুলির জন্য, একটি বিদ্যমান উত্তরে একটি মন্তব্য যুক্ত করা উত্তর যুক্ত করার চেয়ে বেশি উপযুক্ত হতে পারে, বিশেষত যদি এই অনুলিপি করা উত্তরটিতে মূল উত্তরের অন্যান্য তথ্যের প্রচুর অভাব থাকে। একবার আপনি আরও কিছু খ্যাতি সংগ্রহ করার পরে, আপনি অন্য ব্যক্তির জবাবগুলিতে মন্তব্য যুক্ত করতে সক্ষম হবেন। আপাতত অনন্য, মূল্যবান প্রশ্ন জিজ্ঞাসা করে বা একা দাঁড়িয়ে, ভাল উত্তর দিয়ে খ্যাতি সংগ্রহের চেষ্টা করুন।
সিএফআই

1
যেহেতু আপনি নোলান 000০০০ এর উত্তর উল্লেখ করছেন, দয়া করে নোট করুন যে পোস্টার ধরডি ইতিমধ্যে মন্তব্য করেছিলেন যে তিনি নোলান 000০০০ এর উত্তর গ্রহণ করবেন না কারণ তিনি কোনও স্ক্রিপ্ট খুঁজছেন না। সুতরাং আপনার উত্তরটি কঠোরভাবে বলা প্রশ্নের উত্তর দেয় না।
সিফাই

ফাংশনটি যুক্ত করা যেতে পারে .profileএবং তাই ইন্টারেক্টিভ ব্যবহারের জন্য উপলব্ধ।
আদিব

এই যদি কাজ করবে না $1একটি প্লেইন ফাইলের নাম হল: get_abs_filename foo-> কিছুই (অথবা <current_dir>/foo/fooযদি fooএকটি ডিরেক্টরি যায়)।
ivan_pozdeev

2

এটি প্রশ্নের উত্তর নয়, তবে যারা স্ক্রিপ্টিং করেন তাদের জন্য:

echo `cd "$1" 2>/dev/null&&pwd||(cd "$(dirname "$1")";pwd|sed "s|/*\$|/${1##*/}|")`

এটি সঠিকভাবে পরিচালনা করে .. আমি ওএসএক্সেও কাজ করব বলে মনে হচ্ছে


2

আমি নিম্নোক্ত স্ক্রিপ্টটি আমার সিস্টেমে রেখেছি এবং যখন আমি বর্তমান ডিয়ারে দ্রুত কোনও ফাইলের পুরো পথটি ধরতে চাই তখন আমি এটিকে বাশ ওরফে হিসাবে ডাকি:

#!/bin/bash
/usr/bin/find "$PWD" -maxdepth 1 -mindepth 1 -name "$1"

আমি নিশ্চিত না কেন, তবে, OS OS এ যখন কোনও স্ক্রিপ্ট "$ PWD" দ্বারা ডাকা হয় তা পরম পথে প্রসারিত হয়। কমান্ড লাইনে যখন ফাইন্ড কমান্ড কল করা হয় তখন তা হয় না। তবে এটি যা আমি চাই ... উপভোগ করি।


$PWDসর্বদা ওয়ার্কিং ডিরেক্টরি এর পরম পাথ আছে। এছাড়াও, findস্ল্যাশ সহ্য করবে না, তাই আপনি যেমন জিজ্ঞাসা করেছেন তেমন উত্তর দিচ্ছেন না। একটি দ্রুততর উপায় আপনাকে যা করতে হবে কেবল হবে খুঁজছেন কি করতেecho "$PWD/$1"
আদম কাট্স

2

আপনি কেবল বিল্টিনগুলি ব্যবহার করতে চাইলে সবচেয়ে সহজটি সম্ভবত:

find `pwd` -name fileName

টাইপ করতে কেবল অতিরিক্ত দুটি শব্দ এবং এটি ইউনিক্স সিস্টেম এবং ওএসএক্স-এ কাজ করবে।


আমি -maxdepth 1আগে যুক্ত করব -name(ধরুন ফাইলটি বর্তমান ডিরেক্টরিতে রয়েছে)। তা ছাড়া এটি পিডব্লুডির কোনও উপ-ডিরেক্টরিতে ফাইলগুলির সাথে কাজ করবে তবে অন্যের সাথে নয়।
ওয়াল্টার ট্রস

প্রকৃতপক্ষে আপনি ঠিক বলেছেন, প্রশ্নটি নির্দিষ্ট করে দিয়েছে যে ফাইলটি বর্তমান ডিরেক্টরিতে থাকবে। আপনার অর্থ "তবে অন্যের সাথে নয়"?
আরজ

আমি বলতে চাইছি findনীচে ডিরেক্টরি গাছের বাইরে কোনও ফাইল খুঁজে পাবে না pwd। উদাহরণস্বরূপ, যদি আপনি চেষ্টা করেন তবে find . -name ../existingFileএটি ব্যর্থ হয়।
ওয়াল্টার ট্রস

যথেষ্ট উপযুক্ত, হ্যাঁ এই আপনি ধরে নিতে চাইবেন যে আপনি আপনার সিডাব্লুতে (মূল প্রশ্ন অনুসারে) বা আপনার সিডাব্লু গাছের যে কোনও জায়গায় (মূল প্রশ্নে নয়) কোনও ফাইলের পুরো পথ মুদ্রণ করতে চান।
আরজ

1
#! /bin/bash

file="$@"
realpath "$file" 2>/dev/null || eval realpath $(echo $file | sed 's/ /\\ /g')

এটি realpathশেল স্ক্রিপ্টে এটির ত্রুটিগুলি পূরণ করে fullpath। আপনি এখন কল করতে পারেন:

$ cd && touch a\ a && rm A 2>/dev/null 
$ fullpath "a a"
/home/user/a a
$ fullpath ~/a\ a
/home/user/a a
$ fullpath A
A: No such file or directory.

এটি কী সমাধান করে? realpath "foo bar"-> /home/myname/foo bar। আপনি যদি কমান্ড লাইন যুক্তি উদ্ধৃত করতে বিরক্ত না হন তবে এটি realpathদোষ নয়।
ivan_pozdeev

সম্মতি জানানো হয়েছে, এটি সুবিধামত র‍্যাপারটি আরও
শেলফিশ

1

রুবিতে পরম পথ পাওয়ার বিকল্প :

realpath() {ruby -e "require 'Pathname'; puts Pathname.new('$1').realpath.to_s";}

কোন আর্গুমেন্ট (বর্তমান ফোল্ডার) এবং আপেক্ষিক এবং নিখুঁত ফাইল বা ফোল্ডার পাথ হিসাবে উদ্দীপনা হিসাবে কাজ করে।


0

হোমব্রিউ দিয়ে উত্তর দিন

realpathসেরা উত্তর, তবে আপনার যদি এটি ইনস্টল না করা থাকে তবে আপনাকে অবশ্যই প্রথমে চালনা করতে হবে brew install coreutilsযা প্রচুর দুর্দান্ত ক্রিয়াকলাপ সহ কোর্টিলগুলি ইনস্টল করবে । একটি কাস্টম ফাংশন লেখা এবং এটি রফতানি করা খুব বেশি কাজ এবং এর মতো কোনও কিছুর জন্য ত্রুটির ঝুঁকি, এখানে দুটি লাইন রয়েছে:

$ brew install coreutils
$ realpath your-file-name.json 

-1

ওহে ছেলেরা আমি জানি এটি একটি পুরানো থ্রেড তবে আমার মতো এই যে কেউ দেখা করেছেন তার রেফারেন্সের জন্য আমি এই পোস্ট করছি। আমি যদি প্রশ্নটি সঠিকভাবে বুঝতে পারি, আমি locate $filenameকমান্ডটি মনে করি । এটি সরবরাহ করা ফাইলটির পরম পথ প্রদর্শন করে তবে এটি উপস্থিত থাকলেই।


4
locateনাম অনুসারে ফাইল / পাথ অনুসন্ধান করার জন্য একটি ইউটিলিটি। এটি কাজটি করতে পারে তবে অন্যান্য মিলগুলিও খুঁজে পেতে পারে এবং updatedbপ্রথমে রুট হিসাবে কল না করে একটি বিদ্যমান ফাইল খুঁজে নাও পারে ।
ধর্মি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.