2013-06-19 7 views
5

तक इसे पढ़ने के बिना मैंने अस्थायी फ़ाइल बनाने की आवश्यकता के बिना फ़ाइल में/से लाइनों को जोड़ने या हटाने के लिए unix.stackexchange पर विभिन्न प्रश्न/उत्तर यहां पढ़े हैं।फ़ाइल के बीच में सामग्री जोड़ना ..

https://unix.stackexchange.com/questions/11067/is-there-a-way-to-modify-a-file-in-place?lq=1

ऐसा प्रतीत होता है इन सभी प्रश्नों के उत्तर कम से कम करने के लिए एक फ़ाइल है, जो काफ़ी समय लग सकता है, तो इनपुट एक बड़ी फ़ाइल है के अंत तक पढ़ा की जरूरत है। क्या इसके चारों ओर एक रास्ता है? मैं एक फाइल सिस्टम को एक लिंक्ड सूची की तरह कार्यान्वित करने की अपेक्षा करता हूं ... इसलिए आवश्यक "लाइनों" तक पहुंचने का एक तरीका होना चाहिए और फिर सामान (लिंक सूचियों में नोड) जोड़ना चाहिए। मैं यह कार्य कैसे करूं?

क्या मैं ऐसा सोचने में सही हूं? या क्या मुझे कुछ याद आ रही है?

Ps: मुझे इसे 'सी' में करने की आवश्यकता है और किसी भी शेल कमांड का उपयोग नहीं कर सकता है।

+0

फ़ाइलें लिंक की गई सूचियों के रूप में लागू नहीं की गई हैं, इसलिए फ़ाइल के बीच में डेटा डालने का कोई आसान तरीका नहीं है। फ़ाइल के बीच में सम्मिलित डेटा को संभालने के लिए कोड के लिए [SO 10467711] (http://stackoverflow.com/questions/10467711) देखें, लेकिन ध्यान रखें कि यह सम्मिलित बिंदु का पालन करने वाले सभी डेटा की प्रतिलिपि बना देता है सही नई स्थिति। –

उत्तर

4

आप dd का उपयोग कर उदाहरण के लिए जगह में एक फ़ाइल को संशोधित कर सकते हैं।

$ echo Hello world, how are you today? > helloworld.txt 
$ cat helloworld.txt 
Hello world, how are you today? 
$ echo -n Earth | dd of=helloworld.txt conv=notrunc bs=1 seek=6 
$ cat helloworld.txt 
Hello Earth, how are you today? 
$ echo -n Joe | dd of=helloworld.txt conv=notrunc bs=1 seek=6 
Hello Joeth, how are you today? 
$ echo -n Santa Claus | dd of=helloworld.txt conv=notrunc bs=1 seek=6 
Hello Santa Clausare you today? 

जब आप लंबाई बदलने के लिए, आप, फ़ाइल को फिर से लिखने के लिए है, तो पूरी तरह से तो बिंदु पर शुरू नहीं:समस्या यह है कि आपके परिवर्तन भी लंबाई को परिवर्तित करता है, यह काफी सही ढंग से काम नहीं करेगा आपके द्वारा किए गए परिवर्तन का।

सी में यह dd जैसा ही है। आप फ़ाइल खोलते हैं, आप चाहते हैं, और आप लिखते हैं।

6

संक्षिप्त उत्तर है कि हाँ, यह संभव स्थान पर एक फ़ाइल की सामग्री को संशोधित करने के लिए है, लेकिन कोई, इसे हटाने या फ़ाइल के बीच में सामग्री जोड़ने के लिए संभव नहीं है।

यूनिक्स फाइल सिस्टम को inode pointer structure का उपयोग करके कार्यान्वित किया जाता है जो डेटा के पूरे ब्लॉक को इंगित करता है। टेक्स्ट फ़ाइल की प्रत्येक पंक्ति पिछले या अगली पंक्ति के संबंधों के बारे में "जानती" नहीं है, वे ब्लॉक के भीतर एक दूसरे के समीप हैं। उन दो पंक्तियों के बीच सामग्री जोड़ने के लिए निम्नलिखित सभी सामग्री को ब्लॉक के नीचे "नीचे" स्थानांतरित करने की आवश्यकता होगी, जिससे कुछ डेटा अगले ब्लॉक में धकेल जाएंगे, जो बदले में निम्नलिखित ब्लॉक में स्थानांतरित करना होगा,

सी में आप fopen a file for update कर सकते हैं और इसकी सामग्री पढ़ सकते हैं, और कुछ सामग्री को ओवरराइट कर सकते हैं, लेकिन मुझे विश्वास नहीं है कि बीच में नया डेटा डालने या डेटा हटाने के लिए (सैद्धांतिक रूप से) किसी भी तरह से (डेटा को हटाकर छोड़कर इसे हटाएं।

+0

धन्यवाद, आपने जो कहा वह सही है .. लेकिन दुर्भाग्य से मैं केवल एक जवाब स्वीकार कर सकता हूं। तो मैं ऊपर उठने जा रहा हूँ। – user763410

0

आप एक फ़ाइल को पढ़ने/लिखने के तरीके में खोल सकते हैं। आप फ़ाइल को पढ़ते हैं (या यदि आप जानते हैं तो उस स्थिति पर कूदने के लिए "तलाश करें" का उपयोग करें, और फिर फ़ाइल में लिखें, लेकिन आप यहां मौजूद डेटा को ओवरराइट करते हैं (यह एक सम्मिलन नहीं है)। फिर आप अपने द्वारा लिखे गए अंतिम बिंदु से फ़ाइल को ट्रंक करना चुन सकते हैं या उन सभी शेष डेटा को तब तक रख सकते हैं जब आपने उन्हें पढ़े बिना लिखा था।

3

लिनक्स 4.1, fallocate(2)FALLOC_FL_INSERT_RANGE ध्वज का समर्थन करता है, जो किसी को निम्न डेटा को दोबारा लिखने के बिना फ़ाइल के बीच में दी गई लंबाई का एक छेद डालने की अनुमति देता है। हालांकि, यह सीमित है: छेद को फाइल सिस्टम ब्लॉक सीमा पर डाला जाना चाहिए, और डाले गए छेद का आकार फाइल सिस्टम ब्लॉक आकार का एक होना चाहिए। इसके अतिरिक्त, 4.1 में, यह सुविधा केवल एक्सएफएस फाइल सिस्टम द्वारा समर्थित थी, जिसमें Ext4 समर्थन 4.2 में जोड़ा गया था।

अन्य सभी मामलों के लिए, शेष उत्तरों को फिर से लिखना अभी भी आवश्यक है, जैसा कि अन्य उत्तरों में दर्शाया गया है।

+0

धन्यवाद! क्या आपका उत्तर मेरे प्रश्न के अनुरूप है: http://unix.stackexchange.com/q/281652/9689? मैंने इसे वहां उद्धृत किया है, लेकिन यदि आप इसे अपने उत्तर के रूप में जोड़ते हैं तो मुझे इसे उत्तर के रूप में चिह्नित करने और मेरे उद्धरण को हटाने में खुशी होगी। :) –

संबंधित मुद्दे