जवाब है "शायद हां, लेकिन यह फाइलसिस्टम प्रकार, और समय पर निर्भर करता है।"
उन तीन उदाहरणों में से कोई भी मौका छोड़कर पुराने_फाइल या मौजूदा_फाइल के भौतिक डेटा ब्लॉक को अधिलेखित नहीं करेगा।
mv new_file old_file
। यह ओल्ड_फाइल को अनलिंक कर देगा। अगर Old_file में अतिरिक्त हार्ड लिंक हैं, तो ब्लॉक उन शेष लिंक में अपरिवर्तित रहेंगे। अन्यथा, ब्लॉक आम तौर पर (यह फाइलसिस्टम प्रकार पर निर्भर करता है) एक स्वतंत्र सूची में रखा जाएगा। फिर, यदि mv
प्रतिलिपि की आवश्यकता होती है (बस चलती निर्देशिका प्रविष्टियों के विपरीत), नए ब्लॉक को लिखित रूप में आवंटित किया जाएगा mv
।
ये नव-आवंटित ब्लॉक वही हो सकते हैं या नहीं हो सकते हैं जिन्हें अभी मुक्त किया गया था । UFS जैसी फाइलसिस्टम पर , ब्लॉक संभव हैं, यदि संभव हो तो उसी सिलिंडर समूह से, जिस डायरेक्टरी में फाइल बनाई गई थी। इसलिए एक मौका है कि किसी डायरेक्टरी से फाइल को अनइंस्टॉल करके उसी डायरेक्टरी में एक फाइल बनाकर फिर से उपयोग करें ( और अधिलेखित) उन्हीं ब्लॉकों में से कुछ जिन्हें अभी मुक्त किया गया था। यही कारण है कि किसी फ़ाइल को गलती से निकालने वाले लोगों को मानक सलाह यह है कि वे अपनी निर्देशिका ट्री में फ़ाइलों के लिए कोई नया डेटा न लिखें (और अधिमानतः संपूर्ण फ़ाइल सिस्टम के लिए) जब तक कोई फ़ाइल पुनर्प्राप्ति का प्रयास नहीं कर सकता है।
cp new_file old_file
निम्नलिखित करेंगे (आप strace
सिस्टम कॉल को देखने के लिए उपयोग कर सकते हैं ):
open ("old_file", O_WRONLY | O_TRUNC) = 4
O_TRUNC ध्वज के कारण सभी डेटा ब्लॉक मुक्त हो जाएंगे, जैसा mv
कि ऊपर किया गया था। और ऊपर के रूप में, वे आम तौर पर एक मुफ्त सूची में जोड़ दिए जाएंगे, और cp
कमांड द्वारा किए गए बाद के लेखन द्वारा पुन: उपयोग नहीं किया जा सकता है या नहीं ।
vi existing_file
। यदि vi
वास्तव में vim
, :x
कमांड निम्नलिखित करता है:
अनलिंक ("मौजूदा_फाइल ~") = -1 ENOENT (ऐसी कोई फ़ाइल या निर्देशिका नहीं)
नाम बदलें ("मौजूदा_फाइल", "मौजूदा_फाइल ~") = 0
खुला ("मौजूदा_फाइल", O_WRONLY | O_CREAT | O_TRUNC, 0664) - 3
तो यह पुराने डेटा को भी नहीं हटाता है; बैकअप फ़ाइल में डेटा संरक्षित है।
FreeBSD पर, vi
करता है open("existing_file",O_WRONLY|O_CREAT|O_TRUNC, 0664)
, जिसमें cp
ऊपर जैसा ही शब्दार्थ होगा ।
आप विशेष कार्यक्रमों के बिना कुछ या सभी डेटा को पुनर्प्राप्त कर सकते हैं; आप सभी की जरूरत है grep
और dd
, और कच्चे उपकरण तक पहुंच।
छोटी पाठ फ़ाइलों के लिए, आपके द्वारा लिंक किए गए प्रश्न में @Steven D से उत्तरgrep
में एकल कमांड सबसे आसान तरीका है:
grep -i -a -B100 -A100 'text in the deleted file' /dev/sda1
लेकिन बड़ी फ़ाइलों के लिए जो कई गैर-सन्निहित ब्लॉक में हो सकती हैं, मैं यह करता हूं:
grep -a -b "text in the deleted file" /dev/sda1
13813610612:this is some text in the deleted file
जो आपको मिलान लाइन के बाइट्स में ऑफसेट देगा। dd
आदेशों की एक श्रृंखला के साथ इस का पालन करें , के साथ शुरू
dd if=/dev/sda1 count=1 skip=$(expr 13813610612 / 512)
आप उस ब्लॉक से पहले और बाद में कुछ ब्लॉक पढ़ना चाहेंगे। UFS पर, फ़ाइल ब्लॉक आमतौर पर 8KB होते हैं और आमतौर पर काफी संचित रूप से आवंटित किए जाते हैं, एक फाइल के ब्लॉक को अन्य फ़ाइलों या मुक्त स्थान से 8KB ब्लॉक के साथ वैकल्पिक रूप से इंटरलेय किया जा रहा है। UFS पर एक फ़ाइल की पूंछ 7 1KB टुकड़ों तक है, जो कि सन्निहित नहीं भी हो सकती है।
बेशक, फ़ाइल सिस्टम पर जो डेटा को संपीड़ित या एन्क्रिप्ट करते हैं, पुनर्प्राप्ति यह सीधा नहीं हो सकता है।
यूनिक्स में वास्तव में बहुत कम उपयोगिताओं हैं जो एक मौजूदा फ़ाइल के डेटा ब्लॉक को अधिलेखित कर देंगे। जो मन में आता है वह है dd conv=notrunc
। एक और है shred
।