आकार और / या संशोधित तिथि / समय द्वारा अलग-अलग फ़ाइलों को खोजने के लिए फ़ाइलों की सूची के साथ पाठ फ़ाइलों के विरुद्ध भिन्न का उपयोग करें


0

मुझे उन फ़ाइलों को खोजने के लिए दो फ़ोल्डरों की तुलना करने की आवश्यकता है जो या तो हैं:

  • विभिन्न आकार और / या संशोधित तिथि / समय
  • एक से गायब है

मैं diffअपनी स्थिति में दो फ़ोल्डरों के खिलाफ नहीं चल सकता । मेरी योजना findदोनों फ़ोल्डरों पर उपयोग करने और आउटपुट को दो पाठ फ़ाइलों में सहेजने और फिर दो पाठ फ़ाइलों का उपयोग करने की तुलना करने की थी diff

मुझे लगता है कि यह काम करेगा लेकिन यह सुनिश्चित करने की आवश्यकता है क्योंकि मेरे स्रोत / लक्ष्य निर्देशिकाएं बहुत बड़ी हैं और अगर मेरे परीक्षण में कोई अंतर नहीं दिखता है, या यह सभी अंतरों को नहीं ढूंढता है, तो मुझे यह जानने का कोई तरीका नहीं है कि यह काम किया है या नहीं।

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

उदाहरण के लिए, मैं एक दिन फ़ोल्डर की एक सूची लूंगा।

$ find /path/to/folder -exec ls -ld {} \; > inventory-20181101.txt
...

मैं जोड़ने, हटाने, फ़ाइलों को संपादित करने और फ़ोल्डरों और उप-फ़ोल्डरों को जोड़ने या हटाने सहित चीजों का एक गुच्छा संशोधित करूंगा। फिर दूसरे दिन मैं एक और इन्वेंट्री लूंगा।

$ find /path/to/folder -exec ls -ld {} \; > inventory-20181102.txt
...

फिर मैं दोनों फाइलों को अलग कर दूंगा।

$ diff inventory-20181101.txt inventory-20181102.txt

मुझे लगता है कि यह काम करेगा अगर कोई बदलाव नहीं थे या बदलाव मामूली थे, जैसे कि फाइलों को संशोधित करना। लेकिन क्या होता है अगर मैं 5 स्तर के नेस्टेड फ़ोल्डर और फिर इसमें 100 फाइलें जोड़ देता हूं, और एक अन्य शीर्ष-स्तरीय फ़ोल्डर को हटा देता हूं। क्या diffसही फ़ोल्डरों का मिलान कर पाएंगे?


1
कृपया ध्यान दें कि superuser.com एक मुफ्त स्क्रिप्ट / कोड लेखन सेवा नहीं है। यदि आप हमें बताते हैं कि आपने अब तक क्या प्रयास किया है (जिन लिपियों / कोड का आप पहले से उपयोग कर रहे हैं) और जहां आप अटके हुए हैं, तो हम विशिष्ट समस्याओं में मदद करने का प्रयास कर सकते हैं। आपको यह भी पढ़ना चाहिए कि मैं एक अच्छा सवाल कैसे पूछूं?
DavidPostill

1
@DavidPostill मैं किसी को भी मेरे लिए स्क्रिप्ट लिखने के लिए नहीं कह रहा हूं। मैं पूछ रहा हूं कि diffयह कैसे काम करता है और क्या यह पाठ फ़ाइल में सहेजे गए फ़ोल्डर संरचनाओं में अंतर को समझने में सक्षम होगा। मैं अपने प्रश्न में अधिक विस्तार रखूंगा। धन्यवाद!
IMTheNachoMan

2
(1)  findकिसी विशेष क्रम में निर्देशिका में फ़ाइलों को सूचीबद्ध करने की गारंटी नहीं है। यदि आप इसे तत्काल उत्तराधिकार में दो बार चलाते हैं, तो यह संभवत: एक ही परिणाम देगा, लेकिन, महीनों के बाद डायरेक्टरी ट्री में घूमने के बाद चीजें बदलने की संभावना है। किसी भी तरह से संशोधित नहीं की गई फाइलें समान सापेक्ष क्रम में हो सकती हैं, लेकिन मुझे संदेह है कि इसकी भी गारंटी है। (2)  diffबड़े बदलावों के बाद "resync" में विफल होने के लिए कुख्यात है, इसलिए यह कुछ अपरिवर्तित लाइनों को हटाए और डाले जाने के रूप में रिपोर्ट कर सकता है। यह शायद किसी भी बदलाव को याद नहीं करेगा ।
स्कॉट

2
विविधताओं का परीक्षण करने के लिए डमी फ़ोल्डर पर इसे आज़माने के बारे में क्या? आप जिस चीज़ के बारे में चिंतित हैं, उसके कुछ उदाहरण बनाएं और देखें कि आपका दृष्टिकोण कैसे काम करता है। यदि यह स्थिति को संभालता है, तो मात्रा में परिवर्तन नहीं होगा।
फिक्सर 1234

@ fixer1234 मैंने कुछ परीक्षण किए और यह काम कर गया लेकिन मैं यह सुनिश्चित करना चाहता हूं कि यह लाखों फ़ाइलों के साथ बड़े फ़ोल्डरों के लिए काम करेगा। यह स्कॉट की टिप्पणी से की तरह है कि लगता है findऔर diffमेरे लिए विश्वसनीय नहीं होगा।
IMTheNachoMan

जवाबों:


2

एक विश्वसनीय अवलोकन प्राप्त करने के लिए, आपको दोनों निर्देशिकाओं में फ़ाइलों की समान और क्रमबद्ध सूचियों की आवश्यकता होगी, और इन दो सूचियों की तुलना करने का एक तरीका होगा।

जैसा कि बताया गया है, diffफ़ाइलों के बीच मतभेदों के पठनीय, अर्थपूर्ण समझदार साक्षात्कार बनाने के लिए है। यह सादे पाठ या कोड की तुलना करने के लिए बहुत उपयुक्त है, लेकिन सूचियों की तुलना करने के लिए कम उपयुक्त है।
इसके बजाय, commदो सूचियों के बीच समानता या अंतर खोजने के लिए उपयोग करें।

एक "स्वच्छ" सूची उत्पन्न करने के लिए जिसमें केवल आपके लिए आवश्यक जानकारी है, -printfजीएनयू द्वारा प्रदान किए गए विकल्प का उपयोग करें find। यह lsप्रत्येक फ़ाइल के लिए एक प्रक्रिया पैदा करने की तुलना में अधिक कुशल और मजबूत है , और यह सीधे उपयोगी जानकारी को आउटपुट कर सकता है जैसे:

  • %Tk File's last modification time in the format specified by k
  • %s File's size in bytes
  • %p File's name

यह सब एक साथ डालें:

  1. फ़ाइलों को प्रत्येक निर्देशिका में सूचीबद्ध करें (एक प्रारूप में जिसमें केवल आवश्यक जानकारी होती है) → find … -printf …
  2. सूची क्रमबद्ध करें → sort
  3. सभी पंक्तियों को खोजें जो सूचियों के बीच समान नहीं हैं → comm -3: "कॉलम 3 को दबाएं (दोनों फ़ाइलों में दिखाई देने वाली रेखाएं)"
 cd dir1 && find . -printf '%T+ %s %p\n' | sort > ../dir1.txt && cd ..
 cd dir2 && find . -printf '%T+ %s %p\n' | sort > ../dir2.txt && cd ..
 comm -3 dir1.txt dir2.txt > differences.txt

इसके साथ एक चेतावनी %T+: दिनांक प्रारूप में आंशिक सेकंड (2018-11-25 + 14: 58: 43.1197033990) शामिल होंगे। यदि आपकी दो निर्देशिकाएँ अलग-अलग फ़ाइल सिस्टम पर अलग-अलग दिनांक सटीकता के साथ संग्रहीत की जाती हैं, तो आपको भिन्नात्मक सेकंड को बाहर करने के लिए अलग (मैनुअल) तिथि प्रारूप का उपयोग करना पड़ सकता है।


यह शानदार जानकारी है। मैं एक बार इसका प्रयास करूँगा। आपको बहुत - बहुत धन्यवाद!
IMTheNachoMan

का उपयोग करना find … -printf, sortऔर commसभी अच्छे विचार हैं। मामूली नोटों की एक जोड़ी: (1) संशोधन समय के अनुसार उपरोक्त प्रकार। फ़ाइल नाम से छंटनी अधिक उपयोगकर्ता के अनुकूल हो सकती है। (2) हमेशा की तरह, आउटपुट को संसाधित करते समय find, आप उन फ़ाइलों के साथ समस्या में पड़ सकते हैं, जिनके नाम में नई लाइन है। फाइलें जिनके नाम में स्पेस या टैब होता है, एक समस्या हो सकती है, खासकर अगर वे स्पेस या टैब से शुरू होती हैं। (मुझे अपनी पहली टिप्पणी में इसका उल्लेख करना चाहिए ।)
स्कॉट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.