'Rm' और 'अनलिंक' में क्या अंतर है?


55

आपको लगता है कि लक्ष्य एक प्रतीकात्मक लिंक है और एक फ़ाइल नहीं है, क्या लिंक का उपयोग करने rmऔर unlinkहटाने के बीच कोई अंतर है ?


3
यह बहुत अच्छी तरह से ServerFault पर कवर किया जाता है: serverfault.com/questions/38816/...
SLM

@ slm correspond उत्तर उस प्रश्न के अनुरूप हैं, लेकिन यह प्रश्न अलग है, यह कहता है: "यदि आप जानते हैं कि लक्ष्य एक प्रतीकात्मक लिंक है और एक फ़ाइल नहीं है"।
स्टीफन गौरिचोन

ऐसा नहीं लगता कि आपने यहाँ @IQAndreas का उत्तर स्वीकार कर लिया है। कृपया ऐसा करें अगर उन्होंने आपकी मदद की।
ग्रे

जवाबों:


56

किसी भी समय आपके पास इस प्रकार के प्रश्न हैं, यह देखने के लिए कि वास्तव में क्या हो रहा है, थोड़ा परीक्षण की कल्पना करना सबसे अच्छा है। इसके लिए आप उपयोग कर सकते हैं strace

उतारना

$ touch file1
$ strace -s 2000 -o unlink.log unlink file1

rm

$ touch file1
$ strace -s 2000 -o rm.log rm file1

जब आप 2 परिणामी लॉग फ़ाइलों पर एक नज़र डालते हैं, तो आप "कॉल" देख सकते हैं कि प्रत्येक कॉल वास्तव में क्या कर रहा है।

टूट - फूट

इसके साथ unlinkयह unlink()सिस्टम कॉल को लागू कर रहा है:

....
mmap(NULL, 106070960, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f6d025cc000
close(3)                                = 0
unlink("file1")                         = 0
close(1)                                = 0
close(2)                                = 0
exit_group(0)                           = ?
....

इसके साथ rmथोड़ा अलग रास्ता है:

....
ioctl(0, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
newfstatat(AT_FDCWD, "file1", {st_mode=S_IFREG|0664, st_size=0, ...}, AT_SYMLINK_NOFOLLOW) = 0
geteuid()                               = 1000
newfstatat(AT_FDCWD, "file1", {st_mode=S_IFREG|0664, st_size=0, ...}, AT_SYMLINK_NOFOLLOW) = 0
faccessat(AT_FDCWD, "file1", W_OK)      = 0
unlinkat(AT_FDCWD, "file1", 0)          = 0
lseek(0, 0, SEEK_CUR)                   = -1 ESPIPE (Illegal seek)
close(0)                                = 0
close(1)                                = 0
close(2)                                = 0
exit_group(0)                           = ?
+++ exited with 0 +++
...

प्रणाली कॉल unlink()और unlinkat()अनिवार्य रूप से इस आदमी पृष्ठ में वर्णित मतभेदों को छोड़कर समान हैं: http://linux.die.net/man/2/unlinkat

अंश

अनलिंकैट () सिस्टम कॉल ठीक उसी तरह से संचालित होती है जैसे या तो (2) या rmdir (2) (इस पर निर्भर करता है कि झंडे में AT_REMOVEDIR ध्वज शामिल हैं या नहीं) इस मैनुअल पेज में वर्णित अंतरों को छोड़कर।

यदि pathname में दिया गया पथनाम सापेक्ष है, तो यह फाइल डिस्क्रिप्टर dirfd (कॉलिंग प्रक्रिया की वर्तमान कार्यशील निर्देशिका के सापेक्ष के बजाय, जैसा कि अनलिंक (2) और rmdir द्वारा किया जाता है, निर्देशिका के सापेक्ष व्याख्या की गई है) ) एक रिश्तेदार पथनाम के लिए)।

यदि pathname में दिया गया pathname सापेक्ष है और dirfd विशेष मान AT_FDCWD है, तो pathname को कॉलिंग प्रक्रिया की वर्तमान कार्यशील निर्देशिका (जैसे कि अनलिंक (2) और rmdir (2)) के सापेक्ष समझा जाता है।

यदि pathname में दिया गया pathname निरपेक्ष है, तो dirfd को अनदेखा किया जाता है।


1
चूंकि यह दे रहा है AT_FDCWD, इसलिए प्रभावी रूप से unlinkऔर के बीच कोई अंतर नहीं है unlinkat
बामर

6
मुझे इस जवाब को पढ़कर खुशी हुई क्योंकि मैंने एसओ पर एक मूल तरीके से "मछली को सीखा", ​​जब मैं अक्सर मछली प्राप्त करता हूं या कभी-कभी मैं "मछली को सीखता हूं"
ऋषि

21

पोसिक्स निर्दिष्ट करता है कि unlinkउपयोगिता सी लाइब्रेरी unlinkफ़ंक्शन को कॉल करती है और कुछ नहीं। इसका कोई विकल्प नहीं है। यदि आप किसी मान्य पथ का नाम पास करते हैं, जो निर्देशिका नहीं है, और यदि आपके पास उस निर्देशिका के लिए अनुमतियाँ हैं, जहाँ वह ऑब्जेक्ट रहता है, तो unlinkउसे निकाल देंगे।

rmएक पारंपरिक यूनिक्स कमांड है जिसमें थोड़ी अन्य कार्यक्षमता है, और unlink(नीचे देखें) का सुपरसेट नहीं है ।

सबसे पहले, rmसुरक्षा जाँच करता है। यदि आप rmकिसी ऐसी वस्तु के लिए प्रयास करते हैं जिसके पास आपके पास लिखने की अनुमति नहीं है (जो इसे हटाने की आपकी क्षमता के लिए अप्रासंगिक है: सीधे अनुमति हैं!) rmतब तक मना नहीं करता जब तक -fकि निर्दिष्ट नहीं किया जाता है। rmयदि फ़ाइल मौजूद नहीं है, तो सामान्य रूप से शिकायत होती है unlink; हालांकि -f, के साथ rmशिकायत नहीं करता है। यह अक्सर मेकफाइल्स में शोषण किया जाता है ( clean: @rm -f $(OBJS) ...) तो make cleanतब विफल नहीं होता है जब हटाने के लिए कुछ नहीं होता है।

दूसरे, के rmपास -iअंतःक्रियात्मक रूप से डिलीट की पुष्टि करने का विकल्प है।

तीसरा, rmहै -rरिकर्सिवली एक निर्देशिका है, जो कुछ है जो है दूर करने के लिए unlink, करने के लिए आवश्यक नहीं है के बाद से सी पुस्तकालय समारोह है कि नहीं करता है।

unlinkउपयोगिता वास्तव में एक छीन नीचे नहीं है rmयह क्या rmकरता है की एक सबसेट करता है, लेकिन इसमें शब्दार्थ है जो बिना किसी के rm साथ -f और rm का संयोजन है । -f

मान लीजिए कि आप अपनी नियमित अनुमतियों की परवाह किए बिना एक नियमित फ़ाइल को निकालना चाहते हैं। इसके अलावा, मान लें कि यदि फ़ाइल मौजूद नहीं है, या किसी अन्य कारण से आप कमांड को विफल करना चाहते हैं। न तो rm fileहै और न ही rm -f fileआवश्यकताओं को पूरा करती। rm fileयदि फाइल लिखने योग्य नहीं है तो मना कर देगा। लेकिन rm -f fileअगर फ़ाइल गायब है, तो शिकायत करने की उपेक्षा करेंगे। unlink fileनौकरी करता है।

unlinkशायद इसलिए पेश किया गया था क्योंकि rmबहुत चालाक है: कभी-कभी आप सिर्फ शुद्ध यूनिक्स unlinkशब्दार्थ चाहते हैं : "कृपया इस निर्देशिका में प्रवेश करें ताकि निर्देशिका की अनुमति हो"


2
यह यहाँ स्पष्ट जवाब है। यह वास्तव में देता है उपयोग के मामले के लिए unlinkबस का वर्णन के अंतर के बजाय।
वाइल्डकार्ड

19

एक ही फाइल के साथ, rm और अनलिंक एक ही कार्य करते हैं, फाइल को हटा दें। POSIX के रूप में परिभाषित किया गया है, rmऔर unlinkदोनों को कॉल करने के लिए कॉल () सिस्टम कॉल।

जीएनयू में rm, यह करने के लिए कॉल unlinkat () सिस्टम कॉल है, जो के बराबर है unlink()या rmdir () इस मामले में जहां पथ एक रिश्तेदार पथ निर्दिष्ट करता है को छोड़कर कार्य करते हैं।

ध्यान दें

कुछ सिस्टम पर, unlinkडायरेक्टरी भी हटा सकते हैं। कम से कम ग्नू प्रणाली में, unlinkएक निर्देशिका का नाम कभी नहीं हटा सकता।

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