2011-04-24 9 views
9

खोजने के लिए ढूंढें मैं एक नए खोज के लिए एक खोज परिणाम पाइप करना चाहता हूं। क्या मेरे पास है:पाइपिंग

find . -iname "2010-06*" -maxdepth 1 -type d | xargs -0 find '{}' -iname "*.jpg" 

अपेक्षित परिणाम: दूसरा खोजने 2010-06 से शुरू होने वाले फ़ोल्डरों की सूची प्राप्त करता है, दूसरा खोज उन फ़ोल्डर के भीतर निहित जेपीजी की की एक सूची देता है।

वास्तविक परिणाम: "लगता है: ./2010-06 न्यू यॉर्क \ N: अज्ञात विकल्प"

ओह रफ़ू। मुझे लगता है कि यह आउटपुट के प्रारूप से संबंधित है जो दूसरे खोज को इनपुट के रूप में प्राप्त करता है, लेकिन मेरा एकमात्र विचार प्रत्यय -प्रिंट 0 को पहले खोजना था, बिना किसी बदलाव के।

कोई विचार?

उत्तर

8

आपको 2 चीजों की आवश्यकता है। -print0, और अधिक महत्वपूर्ण -I{} xargs पर, अन्यथा {} कुछ भी नहीं करता है।

find . -iname "2010-06*" -maxdepth 1 -type d -print0 | xargs -0 -I{} find '{}' -iname '*.jpg' 
+0

शानदार। यह उम्मीद के रूप में काम करता है। –

+1

क्या आप वाकई यह काम करते हैं? maxdepth पहले से आना चाहिए -नाम – ghostdog74

+0

'आदमी खोज' से: "और यह माना जाता है कि ऑपरेटर को छोड़ दिया गया है।" इस प्रकार आदेश कोई फर्क नहीं पड़ता क्योंकि उनका मूल्यांकन किया जाता है और सभी सत्य होना चाहिए। –

1

कैसे

find . -iwholename "./2010-06*/*.jpg 

आदि के बारे में?

+0

आपको विकल्प को दिए गए मान में अग्रणी "./" शामिल करना होगा। –

+0

यह '-वोहोलेनाम 'है,' -इहोलपाथ 'नहीं –

+0

अधिक सुंदर समाधान, आप सही हैं। यद्यपि मैंने पूरी तरह से व्याख्या नहीं की थी, कि मुझे पाइप बनाने में दिलचस्पी है, और विशेष रूप से यह समस्या नहीं मिलती है। हालांकि धन्यवाद। :-) –

1

हालांकि आपने कहा था कि आप विशेष रूप से यह चाहते हैं कि यह पाइप समस्या काम करे, इसके अतिरिक्त एक अतिरिक्त find कमांड को फोर्क करने में अक्षम है। चूंकि आप निर्दिष्ट कर रहे हैं -मैक्सडेप 1 के रूप में, आप उपनिर्देशिकाओं को पार नहीं कर रहे हैं। तो खोल विस्तार के साथ बस for पाश का उपयोग करें।

for file in *2010-06*/*.jpg 
do 
    echo "$file" 
done 

आप प्रत्येक 2010-06 * फ़ोल्डरों रिकर्सिवली के अंदर सभी jpg फ़ाइलों को ढूंढना चाहते हैं, वहाँ भी कई उपयोग करने की आवश्यकता है finds या xargs

for directory in 2010-06*/ 
do 
    find $directory -iname "*.jpg" -type f 
done 

या बस

find 2006-06* -type f -iname "*.jpg"

या इससे भी बेहतर, यदि आपके पास 4 और

है
shopt -s globstar 
shopt -s nullglob 
for file in 2010-06*/**/*.jpg 
do 
    echo "$file" 
done 
+1

यह कार्यक्षमता से मेल नहीं खाता है।-मैक्सडेप 1 समाप्त होता है ./abc/2010-06/def/ghi.jpg, लेकिन नहीं ./2010-06/def/ghi.jpg। –

+0

मेरा सुझाव है कि आप अपने लिए एक परीक्षण करें और पता लगाएं। Maxdepth क्या है के लिए ढूंढें मैन पेज देखें। – ghostdog74

+1

मेरा सुझाव है कि आप इस परीक्षण मामले को आजमाएं: 'mkdir -p 2010-06/def; 2010-06/def/ghi.jpg स्पर्श करें; * 2010-06 */*। jpg में फ़ाइल के लिए; echo "$ फ़ाइल" करें; किया गया आउटपुट: 'बैश: कोई मिलान नहीं: * 2010-06 */*। jpg' (बैश के ग्लोब असफल होने के साथ) –

6

xargs का बेकार उपयोग।

find 2010-06* -iname "*.jpg" 

कम से कम ग्नू-खोज में खोज करने के लिए कई रास्तों स्वीकार करता है। -maxdepth और -d टाइप परोक्ष माना जाता है।

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