जांचें कि क्या दो रास्ते एक ही फाइल की ओर इशारा कर रहे हैं


12

मुझे संस्करण सेटिंग के तहत फ़ाइलों को रखने के लिए, मेरी होम निर्देशिका में अपनी सेटिंग निर्देशिका में पुनरावृत्ति बनाने के लिए एक स्क्रिप्ट मिली है। मैं चाहूंगा कि यह उन फाइलों को छोड़ दे, जो पहले से ही पेरेंट डाइरेक्टरी के माध्यम से सिम्प्लाइड हैं। यही है, अगर मेरे पास ये फाइलें / निर्देशिका हैं:

~/foo/ -> ~/settings/foo/
~/settings/foo/
~/settings/foo/bar

, मैं कैसे जांच करूं कि ~ / foo / bar और ~ / settings / foo / bar एक ही फाइल हैं?

संपादित करें : डी'ओह, खोज के कुछ मिनटों में उत्तर का पता चला :readlink -f $path

जवाबों:


6

यदि दो फ़ाइलों में एक ही डिवाइसआईडी और इनकोड है, तो वे एक ही फाइल हैं। statकमांड लाइन टूल इस खोजने के लिए आसान बनाता है

if [ "$(stat -c "%d:%i" FILE1)" == "$(stat -c "%d:%i" FILE2)" ]`

...

यह सिमिलिंक फाइल्स या हार्डलिंक फाइल्स के लिए काम करता है।


5
प्रतीकात्मक लिंक का पालन करने के लिए, आपको आवश्यकता है stat -L
गाइल्स का SO- दुष्ट होना बंद हो '

जैसे @ गिल्स ने कहा, -L स्विच के बिना, आपको कुछ वितरणों पर गलत परिणाम मिल सकते हैं
Olaseni

19

कई गोले -efमें testबेसिन (या इसके समानार्थी [) के लिए एक ऑपरेटर होता है, जो यह परीक्षण करता है कि दो रास्ते एक ही मौजूदा फ़ाइल (प्रतीकात्मक लिंक के बाद) को इंगित करते हैं या नहीं । इसमें बैश, डैश, pdksh, ksh88, ksh93 और zsh शामिल हैं, लेकिन POSIX श नहीं। बैश, ksh या zsh में, आप सशर्त निर्माण -efमें भी उपयोग कर सकते हैं [[ … ]]

if ! [ "$1" -ef "$2" ]; then # $1 and $2 are different files

1
मेरे मैनपेज के अनुसार, रीफ ठीक उसी तरह से करता है जैसे रिच होमोलका का जवाब।
user13852

2
@ user13852 -efको अधिक पोर्टेबल होने का लाभ है (थोड़ा तेज़ भी है, लेकिन ऐसा नहीं है कि आप ज्यादातर समय नोटिस करेंगे)। उदाहरण के लिए यह * BSD, OSX, BusyBox के साथ-साथ Linux / Cygwin (GNU) पर काम करता है। यह भी स्पष्ट है, क्योंकि यह वही करता है जो आवश्यक है। केवल एक फायदा है कि मैं कॉलिंग statको देख सकता हूं , जब आप सिमिलिंक का पालन नहीं करना चाहते हैं।
गिल्स एसओ- बुराई को रोकें '10

0

सॉफ्टलिंक के लिए (साथ बनाया गया ln -s) आप उपयोग कर सकते हैं realpath। हालांकि यह हार्डलिंक के लिए काम नहीं करेगा।

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