`find` with multiple` -name` और `-exec` केवल` -name` के अंतिम मैचों को निष्पादित करता है


74

जब मैं उपयोग कर रहा हूं

find . -type f -name "*.htm*" -o -name "*.js*" -o -name "*.txt"

यह सभी प्रकार की फ़ाइल पाता है। लेकिन जब मैं -execअंत में जोड़ता हूं :

find . -type f -name "*.htm*" -o -name "*.js*" -o -name "*.txt" -exec sh -c 'echo "$0"' {} \;

ऐसा लगता है कि यह केवल .txtफाइलों को प्रिंट करता है। मैं क्या गलत कर रहा हूं?

नोट: MINGW (Git Bash) का उपयोग


संकेत: पहला कमांड उन निर्देशिकाओं को भी प्रिंट करेगा जिनके नाम मेल खाते हैं *.js*या *.txt
वाइल्डकार्ड

जवाबों:


99
खोजो। -Type f -name "* .htm *" -o -name "* .js *" -o -name "* .txt"

इसके लिए छोटा है:

खोजो। \ \ (( -type f -a -name "* .htm *" \) -o \ _
          \ \ -name "* .js *" \) -o \
          \ _-name "* .txt" \) \
       \) -एक छाप

ऐसा इसलिए है, क्योंकि कोई भी एक्शन डेडिकेटेड (केवल शर्तों ) को निर्दिष्ट नहीं किया गया है , एक -printएक्शन स्पष्ट रूप से उन फाइलों के लिए जोड़ा जाता है जो स्थितियों से मेल खाती हैं।

(और, वैसे, जो गैर-नियमित .jsफ़ाइलों को प्रिंट करेगा ( -type fकेवल .htmफाइलों पर लागू होता है ))।

जबकि:

खोजो। -type f -name "* .htm *" -o -name "* .js *" -o -name "* .txt" \।
  -exec sh -c 'इको "$ 0"' {} \;

इसके लिए छोटा है:

खोजो। \ \ -type f -a -name "* .htm *" \) -o \
       \ \ -name "* .js *" \) -o \
       \ "-name" * .txt " -a -ecec sh -c 'echo" $ 0 "' {} \ ?!) ;

For find(कई भाषाओं की तरह), AND ( -a; निहितार्थ जब छोड़ा गया हो) OR ( -o) पर पूर्ववर्ती है , और एक स्पष्ट कार्रवाई जोड़कर (यहां -exec) -printऊपर दी गई अंतर्निहित कार्रवाई को रद्द कर देता है। यहाँ, आप चाहते हैं:

find . -type f \( -name "*.htm*" -o -name "*.js*" -o -name "*.txt" \) \
  -exec sh -c 'echo "$0"' {} \;

या:

find . -type f \( -name "*.htm*" -o -name "*.js*" -o -name "*.txt" \) -exec sh -c '
   for i do
     echo "$i"
   done' sh {} +

shप्रति फ़ाइल एक चलाने से बचने के लिए ।


उन sh -c उपयोगों में से कुछ में, आपको sh के लिए zeroth तर्क जोड़ने की आवश्यकता है (हालांकि दूसरों में आपने इसे पहले ही शामिल किया था)।
जेम्स यंगमैन

1
यह एक महान जवाब है!
एक

30

यह निहित कोष्ठक है। स्पष्ट कोष्ठक जोड़ें।\( \)

find . -type f \( -name "*.htm*" -o -name "*.js*" -o -name "*.txt" \) -exec sh -c 'echo "$0"' {} \;

या xargs का उपयोग करना (मुझे xargs पसंद है मुझे यह आसान लगता है, लेकिन स्पष्ट रूप से पोर्टेबल नहीं है)।

find . -type f \( -name "*.htm*" -o -name "*.js*" -o -name "*.txt" \) -print0 | xargs -0 -n1 echo
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.