जब तक आप फ़ाइल को फ़ाइल-सिस्टम सीमाओं में स्थानांतरित नहीं करते हैं, तब तक ऑपरेशन सुरक्षित होना चाहिए। यह तंत्र के कारण है, कैसे »चलती« वास्तव में किया जाता है।
यदि आप mv
एक ही फाइल-सिस्टम पर एक फाइल रखते हैं, तो फाइल वास्तव में छुआ नहीं है, लेकिन केवल फाइल-सिस्टम प्रविष्टि को बदल दिया गया है।
$ mv foo bar
वास्तव में कुछ पसंद करता है
$ ln foo bar
$ rm foo
यह एक बन जाएगा कठिन फ़ाइल (वास्तव में inode फ़ाइल-प्रणाली प्रवेश द्वारा बताया) के लिए लिंक (एक दूसरे निर्देशिका प्रविष्टि) foo
नाम दिया है bar
और हटाने foo
प्रविष्टि। चूंकि अब हटाते समय foo
, एक दूसरी फाइल-सिस्टम प्रविष्टि होती है foo
, जो पुराने इनोड को इंगित करती है , पुरानी प्रविष्टि को हटाने से foo
वास्तव में इनोड से संबंधित किसी भी ब्लॉक को हटाया नहीं जाता है।
आपका प्रोग्राम खुशी-खुशी किसी भी तरह से फाइल में संलग्न हो जाएगा, क्योंकि इसकी खुली फाइल-हैंडल फाइल के इनकोड की ओर इशारा करती है, न कि फाइल-सिस्टम एंट्री की।
नोट: यदि आपका प्रोग्राम बंद हो जाता है और फ़ाइल को राइट्स के बीच फिर से खोल दिया जाता है, तो आप पुरानी फ़ाइल-सिस्टम प्रविष्टि के साथ बनाई गई एक नई फ़ाइल समाप्त कर देंगे !
क्रॉस फ़ाइल-सिस्टम चाल:
यदि आप फ़ाइल को फ़ाइल-सिस्टम सीमाओं के पार ले जाते हैं, तो चीजें बदसूरत हो जाती हैं। इस मामले में आप अपनी फ़ाइल को लगातार बनाए रखने की गारंटी नहीं दे सकते, क्योंकि mv
वास्तव में यह है
- लक्ष्य फ़ाइल-सिस्टम पर एक नई फ़ाइल बनाएँ
- पुरानी फ़ाइल की सामग्री को नई फ़ाइल में कॉपी करें
- पुरानी फाइल को हटा दें
या
$ cp /path/to/foo /path/to/bar
$ rm /path/to/foo
resp।
$ touch /path/to/bar
$ cat < /path/to/foo > /path/to/bar
$ rm /path/to/foo
इस बात पर निर्भर करते हुए कि आपके आवेदन के लेखन के दौरान कॉपी एंड-ऑफ़-फ़ाइल तक पहुंचती है या नहीं, ऐसा हो सकता है कि आपके पास नई फ़ाइल में केवल एक पंक्ति हो।
इसके अतिरिक्त, यदि आपका एप्लिकेशन पुरानी फ़ाइल को बंद नहीं करता है और उसे फिर से खोल देता है, तो यह पुरानी फ़ाइल को लिखना जारी रखेगा, भले ही वह नष्ट हो जाए: कर्नेल जानता है कि कौन सी फाइलें खुली हैं और यद्यपि यह फ़ाइल-सिस्टम प्रविष्टि को हटा देगा, यह जब तक आपका एप्लिकेशन अपनी खुली फ़ाइल-हैंडल को बंद नहीं करता है, तब तक पुरानी फ़ाइल का इनकोड और संबद्ध ब्लॉक नहीं हटाएगा।
rename()
सिस्टम कॉल नहीं था । तोmv
वास्तव में मूल संस्करण नेlink()
हार्ड लिंक बनाने के लिए कॉल किया था , इसके बादunlink()
मूल नाम को हटा दिया गया था।rename()
FreeBSD में जोड़ा गया था, इसे कर्नेल में परमाणु रूप से लागू करने के लिए।