অনুসন্ধান ব্যবহার করার সময় আমি কীভাবে একাধিক কমান্ড কার্যকর করব?


57

আমি যে জিনিসগুলি পেয়েছি তার উপর একাধিক কমান্ড চালানোর চেষ্টা করছি, কীভাবে আমি এটি অর্জন করতে পারি?

find . -exec cmd1; cmd2

কাজ করে বলে মনে হয় না; এটি পরিবর্তে cmd2 সঞ্চালিত হয় প্রতিটি ফাইলের উপর cmd1 নির্বাহের পরে।

উত্তর:


40

এই প্রদর্শনীতে, আমি প্রথমটির জন্য sh -c 'echo first; false'(বা true) ব্যবহার করব -exec। এটি কিছু আউটপুট দেবে এবং নির্বাচিত প্রস্থান কোডের প্রভাবও ফেলবে। তারপরে echo secondদ্বিতীয়টির জন্য ব্যবহৃত হবে। ধরে নিন যে বর্তমান ডিরেক্টরিতে একটি ফাইল আছে।

$ find . -type f -exec sh -c 'echo first; false' \; -exec echo second \;
first
$ find . -type f -exec sh -c 'echo first; true' \; -exec echo second \;
first
second
$ find . -type f \( -exec sh -c 'echo first; false' \; -false -o -exec echo second \; \)
first
second
$ find . -type f \( -exec sh -c 'echo first; false' \; -false -o -exec echo second \; \)
first
second

এই ধরণের সত্যিকারের আদেশটি দেখতে পাবেন:

find . -type f \( -exec command1 \; -false -o -exec command2 \; \)

দ্বিতীয় সেটে, পালানো বন্ধনী দুটি -execদফা গ্রুপ করেছে । -falseতাদের মধ্যে "FALSE" এবং পরীক্ষা রাষ্ট্র বাধ্য করে -oকারণ পরবর্তী অভিব্যক্তি (দ্বিতীয় -exec) কারণ মূল্যায়ন করা -false

থেকে man find:

expr1 expr2 পর পর
দুটি অভিব্যক্তি একটি অন্তর্ভুক্ত "এবং" এর সাথে যোগ দিতে নেওয়া হয়; expr1 টি মিথ্যা হলে expr2 মূল্যায়ন করা হয় না।

expr1 -a expr2
expr1 expr2 হিসাবে একই।

expr1 -o expr2
বা; expr1 টি সত্য হলে expr2 মূল্যায়ন করা হয় না।


আহ হ্যাঁ, আমি ভুলে গেছি -o
Ignacio Vazquez-Abram

32

আপনি যদি ত্রুটি কোডের কারণে সেমিডিডি 2 চালানো থেকে প্রতিরোধ করতে সক্ষম হন সে বিষয়ে সিডিডি 1 সক্ষম না হও 0:

find . -exec cmd1 \; -exec cmd2 \;

সর্বদা এটি চালানোর জন্য উভয় কমান্ড পাওয়ার একমাত্র নির্ভরযোগ্য উপায় হ'ল findশেলটি আহরণ করা যা পরবর্তীকালে কমান্ডগুলি ধারাবাহিকভাবে চালিত করে:

find . -exec bash -c 'cmd1; cmd2' filedumper {} \;

2

আপনি যদি কোনও স্ক্রিপ্ট তৈরি করতে আপত্তি করেন না যা cmd1 এবং cmd2 করে, তবে এটি কেবল এটি:

find . -exec myscript {} \;

অথবা

find . -exec myscript {} +

ব্যবহার করুন \; অথবা + একবারে ম্যাসক্রিপ্ট একাধিক ফাইল হ্যান্ডেল করতে পারে কিনা তার উপর নির্ভর করে (ফাইলের নাম ইত্যাদিতে ফাঁক থাকলে লোমশ হয়)।

আপনি আমার স্ক্রিপ্টে যা যা করছিলেন তা আমার অভিজ্ঞতা অনুসারে রাখার বিষয়টি প্রায় সর্বদা সার্থক ছিল। যদি একবার এটি করতে হয় তবে আপনাকে এটি আবার করতে হবে।

তবে একটি ঝরঝরে কৌশল হ'ল স্ক্রিপ্টটির ভিতরে থাকা:

if [ $# -gt 0 ]; then
    for each; do
        touch $each
    done
else
    find . -exec $0 {} +
fi

তারপরে ম্যাসক্রিপ্ট আপনি যে ফাইলগুলিতে কাজ করেন তার পক্ষে আর্গুমেন্ট হিসাবে কাজ করে তবে আপনি যদি কোনও যুক্তি না দেন তবে এটি বর্তমান দির থেকে খুঁজে পাওয়া যায় এবং তারপরে সন্ধান করা ফাইলগুলিতে নিজেকে কল করে। এটি এই সত্যটির চারপাশে আসে যে সন্ধান করুন-এক্সেক আপনার স্ক্রিপ্টে সংজ্ঞায়িত শেল ফাংশনগুলি কল করতে পারে না।


0

আমি অনেক ভাগ্য ছাড়াই পূর্ববর্তী উভয় সমাধান চেষ্টা করে যাচ্ছি। এই একজন আমার পক্ষে সুন্দরভাবে কাজ করেছেন:

$ for i in `find . -exec echo {} \;`; do cmd1 $i; cmd2 $i; done

ফাইলগুলির তালিকা খুব বড় হলে এটি কাজ করবে না।
অ্যালেক্স

-3

কমান্ড চেষ্টা করুন:

sudo find -name "*[!0-9][1-9].txt" -exec chmod 744 * {} \; -a -exec ls -l {} \; | sort | parallel ls -l

4
হ্যাঁ, এটি একটি ভাল ধারণা নয়। *মধ্যে -execঅংশ বর্তমান ডিরেক্টরির মধ্যে সমস্ত ফাইল প্রসারিত হবে। বিশেষত যখন হিসাবে চলমান sudo
slhck
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.