কোনও সিমিলিংকের উপস্থিতি আছে কিনা তা কীভাবে পরীক্ষা করবেন


208

আমি ব্যাশটিতে একটি সিমিলিংক বিদ্যমান কিনা তা খতিয়ে দেখার চেষ্টা করছি। আমি যা চেষ্টা করেছি তা এখানে।

mda=/usr/mda
if [ ! -L $mda ]; then
  echo "=> File doesn't exist"
fi


mda='/usr/mda'
if [ ! -L $mda ]; then
  echo "=> File doesn't exist"
fi

তবে, এটি কাজ করে না। যদি '!' বাদ দেওয়া হয়, এটি কখনই ট্রিগার করে না। এবং যদি '!' আছে, এটি প্রতিবার ট্রিগার করে।


2
এর মূল্য কি, যদি আপনি [[! -ডি $ এমডিএ]] ঠিক ঠিক কাজ করে ..
ডিএমিন

উত্তর:


327

-Lসত্য "সত্য" প্রত্যাবর্তন যদি "ফাইল" বিদ্যমান থাকে এবং একটি প্রতীকী লিঙ্ক হয় (লিঙ্কযুক্ত ফাইলটি থাকতে পারে বা নাও থাকতে পারে)। আপনি চান -f(ফাইলের উপস্থিতি যদি সত্য থাকে এবং এটি একটি নিয়মিত ফাইল হয় তবে) বা সম্ভবত -e( কেবল প্রকারে ফাইল উপস্থিত থাকলে সত্যটি প্রত্যাশা করে) চান want

জিএনইউ ম্যানপেজ অনুসারে , -hএটি অভিন্ন -L, তবে বিএসডি ম্যানপেজ অনুযায়ী এটি ব্যবহার করা উচিত নয়:

-h file যদি ফাইল বিদ্যমান থাকে এবং এটি একটি প্রতীকী লিঙ্ক হয় তবে সত্য। এই অপারেটরটিকে এই প্রোগ্রামটির পূর্ববর্তী সংস্করণগুলির সাথে সামঞ্জস্য করার জন্য ধরে রাখা হয়েছে। এর অস্তিত্বের উপর নির্ভর করবেন না; পরিবর্তে -L ব্যবহার করুন।


2
আমি দেখতে চাই যে একটি সিমিলিংক বিদ্যমান নেই কিনা। ! -হ বা! -লি সিমলিংকের জন্য কাজ করা উচিত, আমাদের অন্যথায় কাজ করা উচিত।
সহ্য করুন

48
যেমন আমি করেছি যারা Google এর মাধ্যমে এই খুঁজে বের করে সাহায্যের কারো কাছে ব্যবহার পূর্ণ বাক্য গঠন !হয় if ! [ -L $mda ]; then .... fi অর্থাত বিস্ময়বোধক চিহ্ন করা বাহিরে বর্গাকার বন্ধনী।
স্যাম

19
@ স্যামের দেওয়া টিপটিতে কিছুটা যুক্ত করতে চেয়েছিলেন; এই ধরণের ক্রিয়াকলাপগুলি করার পরে শ্বেতস্পেসের সমস্যাগুলি রোধ করতে আপনার ফাইলের নামটি উদ্ধৃতিতে রেখে দেওয়া নিশ্চিত করুন। যেমন if [ ! -L "$mda" ]; then ... fi(দ্রষ্টব্য: if [ ! ... ]এবং if ! [ ... ]অভিন্ন :)
টমাস Vervest

2
আপনি কি সত্যিই -L এবং -h এর মধ্যে পার্থক্য দেখতে পাচ্ছেন? আমার বাশ-এ (সংস্করণ 4.2.53 (1) -রিলেজ (x86_64-redhat-linux-gnu) ম্যান বাশ -L এবং -h উভয়ের জন্যই অভিন্ন এবং তারা একই আচরণ করে, অর্থাৎ তারা পরীক্ষা করে যে ফাইলটি প্রকৃতপক্ষে একটি লিঙ্ক এবং ডন ফাইলের সাথে লিঙ্কযুক্ত উপস্থিত রয়েছে কি নেই
সেদিকে খেয়াল নেই

3
হ্যাঁ, -Lএবং -hহয় একইman testএটিও নিশ্চিত করে
স্পারহক

39

-L পরীক্ষা ফাইলের জন্য বিদ্যমান এবং হয় এছাড়াও একটি সিম্বলিক লিঙ্ক

আপনি যদি ফাইলটি একটি প্রতীকী লিঙ্ক বলে পরীক্ষা করতে না চান তবে কেবল পরীক্ষা (পরীক্ষা, পরীক্ষা, টাইপ (ফাইল, ডিরেক্টরি, সকেট ইত্যাদি) নির্বিশেষে বিদ্যমান কিনা তা পরীক্ষা করে দেখুন -e

সুতরাং যদি ফাইলটি সত্যিই ফাইল হয় এবং কেবল একটি প্রতীকী লিঙ্ক নয় তবে আপনি এই সমস্ত পরীক্ষা করতে পারেন এবং একটি বহির্গমন স্থিতি পেতে পারেন যার মান ত্রুটির অবস্থার ইঙ্গিত দেয়।

if [ ! \( -e "${file}" \) ]
then
     echo "%ERROR: file ${file} does not exist!" >&2
     exit 1
elif [ ! \( -f "${file}" \) ]
then
     echo "%ERROR: ${file} is not a file!" >&2
     exit 2
elif [ ! \( -r "${file}" \) ]
then
     echo "%ERROR: file ${file} is not readable!" >&2
     exit 3
elif [ ! \( -s "${file}" \) ]
then
     echo "%ERROR: file ${file} is empty!" >&2
     exit 4
fi

16
-e "${file}"সিমিলিং বিদ্যমান থাকলেও এর লক্ষ্যটি বিদ্যমান না থাকলে ব্যর্থ হয়।
ফ্লিম 11

1
ফ্লিম হিসাবে একই ফলাফল। আমি ওএস এক্সে আছি me আমার জন্য, -L এবং -h সিমলিংকের জন্য কাজ করে, তবে -ই বা -f নয়।
পলজম

2
@ ফ্লিম, সুতরাং যদি আমি কেবলমাত্র কোনও ফাইলের নাম নেওয়া (যদি এটি কোনও ফাইল বা লক্ষ্যমাত্রা ছাড়াই সিমলিংক হয় কিনা) তা পরীক্ষা করতে চাই তবে এটি করার সর্বোত্তম উপায় কোনটি? স্পষ্টতই
তিনি

38

আপনি একটি সিমিলিংকের অস্তিত্ব যাচাই করতে পারেন এবং এটি এটির সাথে নষ্ট হয়নি:

[ -L ${my_link} ] && [ -e ${my_link} ]

সুতরাং, সম্পূর্ণ সমাধানটি হ'ল:

if [ -L ${my_link} ] ; then
   if [ -e ${my_link} ] ; then
      echo "Good link"
   else
      echo "Broken link"
   fi
elif [ -e ${my_link} ] ; then
   echo "Not a link"
else
   echo "Missing"
fi

2
-সিলার লিঙ্ক, ভাঙ্গা বা না থাকলে এল-টেস্ট করুন। -E এর সাথে সম্মিলন করে লিঙ্কটিও বৈধ কিনা (পরীক্ষা ডিরেক্টরি বা ফাইলের সাথে সংযুক্ত) পরীক্ষা করা সম্ভব। এই সমাধানগুলি আপ-ভোটিং, যেহেতু আমি এই দিকটি ক্যাপচার করা গুরুত্বপূর্ণ মনে করি।
Torbjörn Österdahl

14

আপনি এটি যা খুঁজছেন হতে পারে। কোনও ফাইল বিদ্যমান আছে কিনা এবং তা লিঙ্ক নয় কিনা তা পরীক্ষা করতে।

এই আদেশটি ব্যবহার করে দেখুন:

file="/usr/mda" 
[ -f $file ] && [ ! -L $file ] && echo "$file exists and is not a symlink"

8

কিভাবে ব্যবহার সম্পর্কে readlink?

# if symlink, readlink returns not empty string (the symlink target)
# if string is not empty, test exits w/ 0 (normal)
#
# if non symlink, readlink returns empty string
# if string is empty, test exits w/ 1 (error)
simlink? () {
  test "$(readlink "${1}")";
}

FILE=/usr/mda

if simlink? "${FILE}"; then
  echo $FILE is a symlink
else
  echo $FILE is not a symlink
fi

4

ফাইলটি কি আসলেই একটি প্রতীকী লিঙ্ক? যদি না হয়, অস্তিত্ব জন্য স্বাভাবিক পরীক্ষা -rবা -e

দেখুন man test


3

আপনি যদি ফাইলের অস্তিত্বের জন্য পরীক্ষা করে থাকেন তবে আপনি চান -L নয়। একটি সিমিলিংকের জন্য -L পরীক্ষা।


আমি দেখতে চাই যে একটি সিমিলিংক বিদ্যমান নেই কিনা। ! -হ বা! -লি সিমলিংকের জন্য কাজ করা উচিত, আমাদের অন্যথায় কাজ করা উচিত।
সহ্য করুন

3
আপনি যা চান তা পরিষ্কার নয়। ফাইলটি বিদ্যমান এবং একটি সিমলিংক নয়? তারপরে -e এবং! -H উভয়ই পরীক্ষা করুন ।
অ্যান্ড্রু লাজার 21

3
  1. প্রথমে আপনি এই স্টাইলটি দিয়ে করতে পারেন:

    mda="/usr/mda"
    if [ ! -L "${mda}" ]; then
      echo "=> File doesn't exist"
    fi
  2. আপনি যদি আরও উন্নত শৈলীতে এটি করতে চান তবে নীচের মত এটি লিখতে পারেন:

    #!/bin/bash
    mda="$1"
    if [ -e "$1" ]; then
        if [ ! -L "$1" ]
        then
            echo "you entry is not symlink"
        else
            echo "your entry is symlink"
        fi
    else
      echo "=> File doesn't exist"
    fi

উপরের ফলাফলটি এরকম:

root@linux:~# ./sym.sh /etc/passwd
you entry is not symlink
root@linux:~# ./sym.sh /usr/mda 
your entry is symlink
root@linux:~# ./sym.sh 
=> File doesn't exist

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