यदि कोई फ़ाइल किसी निर्देशिका की प्रतीकात्मक कड़ी है, तो मैं कैसे जाँचूँ?


64

मैं देख सकता हूँ, अगर कोई फ़ाइल मौजूद है और वह एल के साथ एक प्रतीकात्मक लिंक है

for file in *; do
    if [[ -L "$file" ]]; then echo "$file is a symlink"; else echo "$file is not a symlink"; fi
done

और अगर यह -d के साथ एक निर्देशिका है:

for file in *; do
    if [[ -d "$file" ]]; then echo "$file is a directory"; else echo "$file is a regular file"; fi
done

लेकिन मैं केवल निर्देशिका के लिंक के लिए परीक्षण कैसे कर सकता हूं?


मैंने सभी मामलों का परीक्षण फ़ोल्डर में अनुकरण किया:

/tmp/test# ls
a  b  c/  d@  e@  f@

/tmp/test# file *
a: ASCII text
b: ASCII text
c: directory
d: symbolic link to `c'
e: symbolic link to `a'
f: broken symbolic link to `nofile'

जवाबों:


75

बस दो परीक्षणों के साथ गठबंधन करें &&:

if [[ -L "$file" && -d "$file" ]]
then
    echo "$file is a symlink to a directory"
fi

1
यदि आप छिपी हुई फ़ाइलों और निर्देशिकाओं की जांच करना चाहते हैं, तो इससे पहले ही आगे बढ़ें:shopt -s dotglob
rubo77

2
क्या [-L "$ फ़ाइल"] && [-d "$ फ़ाइल"] बेहतर नहीं है? गोले iirc के बीच पोर्टेबिलिटी के साथ कुछ।
लेनार्ट रोलैंड

3
@ Lennart OP का उदाहरण कोड उपयोग करता है [[, और मैंने इसे तार्किक शुरुआती बिंदु के रूप में लिया। इस जवाब के लिए [बनाम [[(लेकिन यहां उपलब्ध है ) की योग्यता की एक चर्चा की गुंजाइश नहीं है


1

एक findसमारोह के साथ और एक समाधान :

dosomething () {
    echo "doing something with $1"; 
}
find -L -path './*' -prune -type d| while read file; do 
    if [[ -L "$file" && -d "$file" ]];
        then dosomething "$file";
    fi; 
done

का उपयोग करना findऔर उसके while readलिए थोड़े ओवरकिल ...
कैमिलो मार्टिन

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