मैं उन फ़ाइलों की सूची कैसे बना सकता हूं जिनमें कोई सहानुभूति नहीं है?


10

मेरे पास विविध दस्तावेजों से भरी एक बड़ी "myfiles" निर्देशिका है और इसकी संरचना को संशोधित नहीं करना चाहती।

इसलिए मैंने दस्तावेजों के प्रत्येक वर्ग के लिए (कई) अन्य निर्देशिकाएं बनाईं। उदाहरण के लिए, मेरे पास एक "छवियां" निर्देशिका है जिसमें विवरण और अन्य मेटाडेटा के साथ "सिम्फनी (समान फ़ाइल नाम के साथ) के लिए" मायफ़ाइल्स "निर्देशिका में प्रत्येक .jpgया .cr2फ़ाइल के लिए सहानुभूति है। सहानुभूति / चित्र निर्देशिका में मूल लिंक की गई फ़ाइल से भिन्न नाम हो सकता है।

मैं यह सुनिश्चित करने का सबसे सरल तरीका ढूंढने की कोशिश कर रहा हूं कि "myfiles" निर्देशिका में प्रत्येक और हर छवि फ़ाइल में "छवियों" निर्देशिका में एक सिमिलिंक है।

फ़ोल्डर संरचना का एक उदाहरण देखें

/myfiles/a.doc
/myfiles/b.jpg
/myfiles/c.cr2
/myfiles/d.mov

परिणाम चाहिए

/images/b_800x600.jpg
/images/b_800x600.desc
/images/c_3820x5640.cr2
/images/c_3820x5640.cr2

पूर्ण उत्तर नहीं, लेकिन आप find /myfiles -type fकिसी फ़ाइल के परिणामों को सहेज सकते find /images -type l -exec readlink {} \; | egrep myfilesहैं, /imagesफिर उन फ़ाइलों की एक सूची प्राप्त करने के लिए उपयोग करें, जो तब sedपहले फ़ाइल में पथों को हटाने के लिए प्रत्येक पर कर रहे परिणामों पर पुनरावृति करते हैं, पहली फ़ाइल में आपके द्वारा सहेजे जाने के बाद से सिम्लिंक है और जो फाइलें बची हैं, वे फाइलें हैं जिनमें सिमलिंक नहीं है।
ब्राचली

2
क्या आपके लिए इसके बजाय हार्डलिंक का उपयोग करना संभव है, इसलिए आप लिंक को देखने के लिए हार्डलिंक काउंटर का उपयोग कर सकते हैं? ls -lआप उपयोग करके हार्डलिंक की गिनती दूसरे कॉलम में देख सकते हैं।
लैम्बर्ट

@Lambert क्या कहता है। rmउन सिम्प्लिंक dirs और pax -rwl -s "\|.*regex|modifes_filename|" /path/to/myfiles/*.jpg /path/to/jpg_dirउदाहरण के लिए उपयोग करने के लिए प्रोग्रामेटिक रूप से बदल फाइलनाम के साथ हार्डलिंक केवल उन लोगों के लिए है जो आपके जेपीजी से मेल खाते हैं। आप इससे बहुत कुछ प्राप्त कर सकते हैं - जैसे बदलाव के समय और आदि के आधार पर बैचिंग करना
mikeserv

जवाबों:


6

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

#!/bin/bash

OIFS="$IFS"
IFS=$'\n'

files="$(find myfiles/ -type f -name '*.jpg' -or -name '*.cr2')"
for f in $files; do
    list="$(find -L images/ -xtype l -samefile "$f")"
    if [[ "$list" == "" ]]; then
        echo "$f does not have symlink."
    fi
done

IFS="$OIFS"

इस दृष्टिकोण के साथ एक चेतावनी है यदि आपके पास निर्देशिका myfiles / 1 में a.jpg फ़ाइल है और आपके पास निर्देशिका चित्रों / 3 में उस फ़ाइल के लिए एक सिम्लिंक है या बस छवियों में / फ़ाइल में गुम सिम्लिंक के साथ रिपोर्ट नहीं की जाएगी।


धन्यवाद ! जी हां आपने सही समझा। बंद करें लेकिन काफी नहीं। मेरी गलती नहीं है आपका :-) मैंने जो उदाहरण दिया वह एक सरल मायफाइल्स निर्देशिका को दर्शाता है। वास्तव में myfiles के तहत छवि फ़ाइलें किसी भी स्तर पर नेस्टेड निर्देशिका के अंदर हो सकती हैं।
रॉबर्ट अलेक्जेंडर

मैंने पूरे myfiles में खोज का उत्तर संपादित किया, लेकिन यह जांचें कि क्या यह आपकी इच्छा है।
तावीज़िन

ALMOST वहां :-) आपकी स्क्रिप्ट को हिचकी आती है जब फाइलों में रिक्त स्थान होते हैं (और शायद अन्य बकवास जैसे एकल एपोस्ट्रोफस में "...
रॉबर्ट अलेक्जेंडर

मुझे लगता है कि अब यह ठीक होना चाहिए
तावीज़िन

आपका अंतिम संशोधन हर अक्षर n की घटना पर हर f को विभाजित करता है! :-) मैंने IFS लाइन को IFS = फिर कीबोर्ड से एक नई पंक्ति में cnahged किया, फिर एक और "। अब विभाजन काम करने लगता है, लेकिन मुझे" मिसलिंक.श: 11: लापतालिंक.श: [[]: का एक लंबा अनुक्रम मिलता है। ”
रॉबर्ट अलेक्जेंडर

3

मुझे लगता है कि के तहत फ़ाइलें myfilesप्रतीकात्मक लिंक नहीं हैं, और फ़ाइल नामों में से कोई भी नई सूची नहीं है। (मेरा दृष्टिकोण अभी भी काम कर सकता है अगर इन मान्यताओं का उल्लंघन किया जाता है, लेकिन यह अधिक जटिल हो जाता है।) मैं यह भी मानता हूं कि आपके पास सामान्य readlinkउपयोगिता है और यह -fकैनोनिकलाइज़ पथों का समर्थन करता है, जो कि लिनक्स (जीएनयू और बिजीबॉक्स दोनों) पर मामला है, लेकिन नहीं उदाहरण के लिए OSX पर।

फ़ाइलों की एक सूची बनाएँ, और इसे अच्छे माप के लिए छाँटें:

find /myfiles -type f -print | sort >all.list

निरपेक्ष रास्तों के साथ प्रतीकात्मक लिंक लक्ष्यों की एक सूची बनाएँ।

find /images -type f -exec readlink -f {} \; | sort >linked.list

उन फ़ाइलों को सूचीबद्ध करें जो लिंक नहीं हैं:

comm -32 all.list linked.list

यदि आप एक शेल का उपयोग करते हैं जो प्रक्रिया प्रतिस्थापन का समर्थन करता है, तो आप इसे एक कमांड में रख सकते हैं:

comm -23 <(find /myfiles -type f -print | sort) \
         <(find /images -type f -exec readlink -f {} \; | sort)

यदि अंडर लिंक /imagesनिरपेक्ष हैं, तो आप विकल्प के readlinkबिना उपयोग कर सकते हैं -f, जो कि * बीएसडी और ओएसएक्स के तहत उपलब्ध है।


मैं आपकी commआज्ञा के अनुसार कुछ पोस्ट करने वाला था लेकिन मैं अब ऐसा नहीं करूँगा कि मैं आपको पहले ही देख चुका हूँ। हालांकि, sortकोई मतलब नहीं से पुनर्निर्देशित ; तब प्रक्रिया प्रतिस्थापन कुछ भी आउटपुट नहीं करेगा। इसके अलावा, आप कई निर्देशिकाओं को जोड़ सकते हैं /imagesयदि आप उन फ़ाइलों को ढूंढना चाहते /myfilesहैं जिनमें किसी भी निर्देशिका के अलावा किसी से भी सहानुभूति नहीं है /images
त्रिकाल

1
देखें stackoverflow.com/questions/7665/... के लिए विकल्प के लिएreadlink -f
tripleee

जब मैं प्रक्रिया पुनर्निर्देशन संस्करण बनाया, तो @tripleee मैं पुनर्निर्देशन बाहर ले जाना भूल गया। हां, आप आसानी से अन्य निर्देशिकाओं को जोड़ सकते हैं या अन्य बदलाव कर सकते हैं।
गिल्स एसओ- बुराई को रोकना '
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.