क्या किसी अन्य 'खोज -सेक्स' के भीतर एक 'खोज-खोज' को घोंसला बनाना संभव है?


14

निम्नलिखित कुछ ऐसा है जो मैं उसके बाद कर रहा हूं, लेकिन मेरा कोड काम नहीं करता है, चाहे मैं कैसे बचूं {}और कैसे बचूं+ ;

find ./ -maxdepth 1 -type d -name '.*' -exec \
    find {} -maxdepth 1 -type f -name '*.ini' -exec \
        md5sum \{\} \\; \;

इसे देखने के बाद और - - यूनिक्स लिनक्स सवाल है, मैं उस निम्नलिखित कोड काम करता मिला, लेकिन यह नेस्टिंग नहीं है खोजने जैसे, और मुझे लगता है वहाँ इस विशेष काम करने के लिए एक बेहतर तरीका है।

find ./ -maxdepth 1 -type d -name '.*' \
-exec bash -c 'for x; do
    find "$x" -maxdepth 1 -type f -name "*.ini" \
    -exec md5sum \{\} \;; \
done' _ {} \+

क्या कोई ऐसा तरीका है find -execजो बिना खोल के घोंसला बनाने की आवश्यकता है (जैसा कि ऊपर है), इसके सभी अजीब उद्धरण और बाधाओं से बचने के लिए?

या क्या यह अपने कई मापदंडों के मिश्रण का उपयोग करके सीधे एकल खोज कमांड में किया जा सकता है?


4
हालांकि यह करना संभव हो सकता है कि आप क्या पूछ रहे हैं, जब चीजें उस जटिल हो जाती हैं, तो मैं शेल या पर्ल स्क्रिप्ट पर स्विच करता हूं। आपका दूसरा कोड स्निपेट बहुत कुछ कर रहा है, केवल शेल स्क्रिप्ट इनलाइन के साथ। वीर वन-लाइनर मनोरंजक हैं, लेकिन उन्हें समझना मुश्किल है, और इस तरह बनाए रखना कठिन है। जब तक यह एक-शॉट सौदा नहीं है कि आप किसी भी तरह से अंत में अच्छा हो रहे हैं, मैं इसे बौद्धिक चुनौती के अलावा करने के लिए एक अच्छा कारण नहीं देख सकता।
वॉरेन यंग

1
@ यार्रेन यंग: मुझे निश्चित रूप से यह नहीं लगता कि यह अवधारणा जटिल है, लेकिन मेरा मतलब है कि आप इसमें कोई आसान तरीका नहीं है find, लेकिन अगर findआप ऐसा नहीं कर सकते हैं, तो उपकरण के रूप में findइतना श्रद्धेय (?) क्यों है ? फ़ाइलों को खोजने के लिए उपयोग करें? ... मैंने subseqeuntly पाया है कि find ./ -maxdepth 2 -path '.*/*.ini' -type f -exec md5sum {} \+मेरी स्थिति में ठीक काम करता है (jw013 के संदर्भ -pruneने मुझे मैन पेज में इसे आगे बढ़ाया ), लेकिन मुझे आश्चर्य है कि अगर यह एक मजबूत तरीका है (जेनेरा में)। मैंने वास्तव में कभी भी find(लिनक्स के एक वर्ष से कम समय में) उपयोग नहीं किया है, जैसा locateकि लगभग सभी को मेरी ज़रूरत है, इसलिए यह अज्ञात क्षेत्र है।
पीटर।

1
-pathपरीक्षण वास्तव में क्या मैं सुझाव लिए जा रहा था है। इसके साथ, आपको वह सब करने में सक्षम होना चाहिए जो आप चाहते हैं (बेस एसोसिएशन के ऐस के लिए खेद है;))
rozcietrzewiacz

जवाबों:


8

मैं एक एकल खोज का उपयोग करने की कोशिश करूंगा जैसे:

find .*/ -maxdepth 1 -type f -name '*.ini' -execdir md5sum {} +

या यहां तक ​​कि ( findबिल्कुल नहीं, सिर्फ शेल गोलाबारी)

md5sum .*/*.ini

हालाँकि, यह -type fचेक की कमी है इसलिए केवल तभी काम करता है जब आपके पास कोई निर्देशिका / गैर-फाइलें समाप्त न हों .ini। यदि आप करते हैं तो आप उपयोग कर सकते हैं

for x in .*/*.ini; do 
    if [ -f "$x" ]; then 
        md5sum "$x"
    fi
done

हालांकि केवल एक md5sum मंगलाचरण की जरूरत का लाभ खो देंगे।

संपादित करें

चेनिंग की एक सामान्य और सुरक्षित विधि के लिए find, आप कुछ ऐसा कर सकते हैं

find <paths> <args> -print0 | xargs -0 -I{.} find {.} <args for second find> [etc.]

मुझे एक त्रुटि मिलती है -f(f?), और फिर एक और त्रुटि के साथ -execdir.. जब मैं -execdir को -exec से प्रतिस्थापित करता हूं , और / या प्रिंट के साथ md5sum की जगह लेता हूं, तो मुझे कुछ भी नहीं मिलता है
पीटर।

धन्यवाद, विकल्प के लिए ... लेकिन मैं इसे इस्तेमाल करने के एक तरीके के बाद और अधिक हूं find... यह इतना नहीं है कि मैं सिर्फ इस उदाहरण को हल करना चाहता हूं, मैं खोज-फू के तरीकों में अंतर्दृष्टि की तलाश कर रहा हूं। । शायद खोजने में फू की तुलना में अधिक फुलाना है .. (मुझे नहीं पता, क्योंकि मैंने वस्तुतः इसका उपयोग कभी नहीं किया है), और यह पहली स्थिति है जिसे मैं वास्तव में इसका उपयोग करना चाहता हूं (छवि फ़ाइलों के लिए वास्तव में) और -exec फीचर मैंने बहुत सुना है जो लगता है कि इसके प्रतिनिधि के रूप में सभी-शक्तिशाली नहीं हैं (...?), (+1 के लिए विकल्प, हालांकि,) .. लेकिन आपका findउदाहरण अभी भी काम नहीं करता है (अभी भी) )
पीटर .O

मुझे यह त्रुटि findकमांड के लिए मिलती है : ... find: The relative path ~ / bin 'को PATH पर्यावरण चर में शामिल किया गया है, जो कि खोज की -execdir कार्रवाई के साथ संयोजन में असुरक्षित है। कृपया $ PATH` से उस प्रविष्टि को हटा दें .... तो शायद यह काम करेगा, लेकिन मुझे कहना होगा कि मैं अब कुछ समय के लिए उस ~ / बिन से छुटकारा पाने की कोशिश कर रहा हूं ... मुझे "अधिक से अधिक लेना होगा" इसे गंभीरता से देखें ... मुझे नहीं पता कि मैंने इसे कहाँ स्थापित किया है ... कोई भी विचार जहां यह गुप्त हो सकता है; ~/binमेरे पथ में
Peter.O

मुझे लगता है कि शक्ति की findउन स्थितियों में सबसे अधिक सराहना की जाती है जो पूरी तरह से ग्लब्स के साथ नहीं की जा सकती हैं, लेकिन जैसा कि उन प्रकार की स्थितियां दुर्लभ हैं, मुझे आमतौर पर इसकी ज्यादा आवश्यकता नहीं है।
jw013

ठीक है .. यह एक दिलचस्प और अच्छी बात है (
ग्लब्स

2

आपकी मूल समस्या को पुनरावर्ती रूप से कॉल करने की आवश्यकता नहीं है, लेकिन मुझे लगता है कि यह बात नहीं थी।

मेरा मानना ​​है कि जिस तरह से आप चाहते हैं, वैसे पुनरावर्ती रूप से कॉल करना संभव नहीं है।

निम्नलिखित कॉलिंग को पुनरावर्ती (या घोंसले के शिकार, जो भी कहा जाता है) या तो नहीं मिल रहा है, लेकिन क्या आप केवल पहले खोजने के परिणाम सेट को नहीं ले सकते हैं और इसे दूसरे को खिला सकते हैं? इस तरह मैं सहज रूप से करूँगा:

find `find ./ -maxdepth 1 -type d -name '.*'` \
    -maxdepth 1 -type f -name '*.ini' -exec md5sum {} \;

आप xargsदूसरी खोज को निष्पादित करने के लिए भी उपयोग कर सकते हैं।

अपडेट करें:

मैं इसे जोड़ना चाहता था क्योंकि अधिकांश UNIX उपयोगिताओं में एक के बजाय कई फ़ाइल नाम तर्क होते हैं, आप आमतौर पर -execपूरी तरह से बच सकते हैं:

md5sum `find \`find ./ -maxdepth 1 -type d -name '.*'\` -maxdepth 1 -type f -name '*.ini'`

जब घोंसले के शिकार आप \आंतरिक लोगों से पहले backslashes जोड़ते हैं।

यदि हम कल्पना करते हैं कि md5sumकेवल एक फ़ाइल नाम तर्क लेता है, तो हम इसे हमेशा forलूप में लपेट सकते हैं :

for f in `find \`find ./ -maxdepth 1 -type d -name '.*'\` -maxdepth 1 -type f -name '*.ini'`
do
    md5sum $f
done

ध्यान दें कि यह अधिक कठिन हो जाता है यदि फ़ाइल / निर्देशिका नाम -किसी स्थान से शुरू या युक्त होते हैं। UNIX उपयोगिताओं उनके साथ अच्छी तरह से नहीं खेलती हैं। उस मामले में जोड़ने ./, --या उद्धरण की आवश्यकता है।

जाहिर है कि मूल उदाहरण एक अच्छा नहीं है, क्योंकि हम बस कर सकते हैं:

md5sum .*/*.ini

1
आपने स्थिति का एक अच्छा अवलोकन दिया है, लेकिन सभी दिखाए गए findतरीकों से एक त्रुटि मिलती है जब एक फ़ाइल / निर्देशिका में स्थान होता है ... md5sum .*/*.iniठीक काम करता है ... मैं सामान्य महसूस करना शुरू कर रहा हूं कि * वॉरेन यंग * findखेल में जल्दी होने के लिए 'जटिल' होने वाली चीजों के बारे में टिप्पणी करें :), लेकिन मेरा मानना findहै कि जब स्थिति परीक्षण अधिक जटिल होते हैं , तो मैं अपने आप में आता हूं , लेकिन जहां तक ​​नेस्टिंग-नेक्स जाता है, मैंने बहुत अच्छा विचार छोड़ दिया है, जैसा कि लगता है कि इसे करने के सरल तरीके हैं .. (लेकिन पर्ल मेरे लिए "सरल" नहीं है (अभी तक) ...
पीटर।

0

कम से कम मैं घोंसला 2 खोजने में कामयाब रहा:

find ~ -maxdepth 1 -type d -name '.*' -execdir \
    find {} -maxdepth 1 -type f -name '*.ini' \;

लेकिन मैं एक और (dir) आह्वान करने के लिए हल नहीं किया - वहाँ से बुलाओ।


हाँ, यह मेरी समस्या बिल्कुल है :)
पीटर।

हां, लेकिन 3 नहीं घोंसले के शिकार घोंसले के शिकार 2 के रूप में ही नहीं है। :)
उपयोगकर्ता अज्ञात
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.