একাধিক `-name` এবং ex -exec` সহ` find` কেবলমাত্র `-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ফাইলগুলি মুদ্রণ করে। আমি কি ভুল করছি?

দ্রষ্টব্য: এমিংডাব্লু (গিট ব্যাশ) ব্যবহার করে


ইঙ্গিত: প্রথম কমান্ড ডিরেক্টরিগুলিও মুদ্রণ করবে যার নাম মেলে *.js*বা *.txt
ওয়াইল্ডকার্ড

উত্তর:


99
খুঁজে। -type f -name "* .htm *" -o-name "* .js *" -o -name "* .txt"

এর জন্য সংক্ষিপ্ত:

খুঁজে। \ (\ ( -প্রকার এফ-এ - নাম "*। htm *" \) -ও \
          \ ( -নাম "* .js *" \) -ও \
          \ ( -নাম "* .txt" \) \
       \) -এ -প্রিন্ট

এটি হ'ল যেহেতু কোনও ক্রিয়াকলাপ নির্দিষ্ট করা হয়নি (কেবলমাত্র শর্ত ), -printশর্তগুলির সাথে মেলে এমন ফাইলগুলির জন্য স্পষ্টভাবে একটি ক্রিয়া যুক্ত করা হয়।

(এবং, যাইহোক, এটি অ-নিয়মিত .jsফাইলগুলি মুদ্রণ করবে ( -type fকেবলমাত্র .htmফাইলগুলিতে প্রযোজ্য ))।

যদিও:

খুঁজে। -type f -name "* .htm *" -o -name "* .js *" -o -name "* .txt" \
  -exec sh -c 'প্রতিধ্বনি "$ 0"' {} \;

এর জন্য সংক্ষিপ্ত:

খুঁজে। -( -প্রকার এফ-এ - নাম "*। htm *" \) -ও \
       \ ( -নাম "* .js *" \) -ও \
       \ ( -নাম "* .txt" -a -exec sh -c 'প্রতিধ্বনি "$ 0"' {} \; \)

জন্য find(বিভিন্ন ভাষায় মতো) এবং ( -a; অন্তর্নিহিত যখন বাদ দেওয়া) বেশি প্রাধান্য রয়েছে বা ( -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 এর জন্য জিরোথ যুক্তি যুক্ত করতে হবে (যদিও অন্যদের মধ্যে আপনি এটি ইতিমধ্যে অন্তর্ভুক্ত করেছেন)।
জেমস ইয়ংম্যান

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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.