अगर सिम्बल मौजूद है तो कैसे जांचें


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
क्या इसके लायक है, अगर आप [[का उपयोग करें! -D $ mda]] ठीक काम करता है ..
DMIN

जवाबों:


327

-Lयदि "फ़ाइल" मौजूद है और यह एक प्रतीकात्मक लिंक है (लिंक की गई फ़ाइल मौजूद हो सकती है या नहीं) तो यह सच है। आप चाहते हैं -f(यदि फ़ाइल मौजूद है और यह एक नियमित फ़ाइल -eहै तो सच है ) या शायद (रिटर्न सही है अगर फ़ाइल प्रकार की परवाह किए बिना मौजूद है)।

के अनुसार जीएनयू मैनपेज , -hके समान है -L, लेकिन के अनुसार बीएसडी मैनपेज , यह नहीं किया जाना चाहिए:

-h file यदि फ़ाइल मौजूद है तो सत्य है और एक प्रतीकात्मक लिंक है। इस ऑपरेटर को इस कार्यक्रम के पिछले संस्करणों के साथ संगतता के लिए रखा गया है। इसके अस्तित्व पर भरोसा मत करो; इसके बजाय -L का उपयोग करें।


2
मैं यह देखने के लिए देख रहा हूं कि क्या कोई सिमलिंक मौजूद नहीं है। -h या! -L को सिम्बलिंक्स के लिए काम करना चाहिए; -ई को अन्यथा काम करना चाहिए।
भालू

48
Google के माध्यम से इसे !खोजने वाले किसी भी व्यक्ति की मदद करने के लिए, पूर्ण सिंटैक्स का उपयोग करते हुए , वर्गाकार कोष्ठक के बाहरif ! [ -L $mda ]; then .... fi विस्मयादिबोधक चिह्न लगाया जाता है ।
सैम

19
बस @Sam द्वारा दी गई टिप में कुछ जोड़ना चाहते थे; इस प्रकार के ऑपरेशन करते समय व्हाट्सएप के मुद्दों को रोकने के लिए, अपनी फ़ाइल का नाम उद्धरण में रखना सुनिश्चित करें। उदाहरण के लिए if [ ! -L "$mda" ]; then ... fi(नोट: if [ ! ... ]और if ! [ ... ]समान हैं :)
थॉमस Vervest

2
क्या आप वास्तव में -L और -h के बीच अंतर देखते हैं? मेरे बैश में (संस्करण 4.2.53 (1) -release (x86_64-redhat-linux-gnu) मैन बैश -L और -h दोनों के लिए समान है और वे एक जैसा व्यवहार करते हैं, अर्थात वे जाँचते हैं कि फ़ाइल रियली एक लिंक है और डॉन 'यह ध्यान रखें कि फ़ाइल से जुड़ी मौजूद है या नहीं।
फिलिप लोरी

3
हाँ, -Lऔर -hकर रहे हैं एक हीman testइसकी पुष्टि भी करता है।
स्पार्कहॉक

39

-L फ़ाइल के लिए परीक्षण मौजूद है और एक प्रतीकात्मक लिंक भी है

यदि आप फ़ाइल को प्रतीकात्मक लिंक होने के लिए परीक्षण नहीं करना चाहते हैं, लेकिन केवल यह देखने के लिए परीक्षण करें कि क्या यह प्रकार (फ़ाइल, निर्देशिका, सॉकेट आदि) की परवाह किए बिना मौजूद है, तो उपयोग करें

तो अगर फ़ाइल वास्तव में फ़ाइल है और न केवल एक प्रतीकात्मक लिंक है, तो आप इन सभी परीक्षणों को कर सकते हैं और एक निकास स्थिति प्राप्त कर सकते हैं जिसका मान त्रुटि स्थिति को इंगित करता है।

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}"यदि सिमलिंक मौजूद है, लेकिन इसका लक्ष्य मौजूद नहीं है।
फ्लिम

1
फ्लिम के समान परिणाम। मैं ओएस एक्स पर हूं। मेरे लिए, -L और -h सिम्बलिंक के लिए काम करते हैं, लेकिन -e या -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
-L टेस्ट करें अगर कोई सिमिलिंक है, टूटा है या नहीं। -सी के साथ संयोजन करके यह जांचना संभव है कि क्या लिंक भी वैध है (किसी निर्देशिका या फ़ाइल से लिंक करना)। इस समाधान को अप वोट करना, क्योंकि मुझे इस पहलू को पकड़ना महत्वपूर्ण लगता है।
Torbjörn dsterdahl

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 परीक्षण एक सिम्लिंक के लिए।


मैं यह देखने के लिए देख रहा हूं कि क्या कोई सिमलिंक मौजूद नहीं है। -h या! -L को सिम्बलिंक्स के लिए काम करना चाहिए; -ई को अन्यथा काम करना चाहिए।
भालू

3
आप जो चाहते हैं वह स्पष्ट नहीं है। फ़ाइल मौजूद है और एक सिमलिंक नहीं है? फिर दोनों का परीक्षण करें -e और! -ह।
एंड्रयू लाजर

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

यदि फ़ाइल मौजूद है तो पहला मंगलाचरण गलत है, लेकिन लिंक नहीं है, या झूलता हुआ लिंक है। दूसरा गलत है यदि पथ एक झूलता हुआ सिमलिंक है।
जोनाथन तोमर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.