অনুসন্ধানে এক্সিকিউটিভ সহ সেমিকোলন (;) বনাম প্লাস (+) ব্যবহার করে


159

কেন ব্যবহারের মধ্যে আউটপুট মধ্যে পার্থক্য আছে

find . -exec ls '{}' \+

এবং

find . -exec ls '{}' \;

আমি পেয়েছি:

$ find . -exec ls  \{\} \+
./file1  ./file2

.:
file1  file2  testdir1

./testdir1:
testdir2

./testdir1/testdir2:


$ find . -exec ls  \{\} \;
file1  file2  testdir1
testdir2
./file2
./file1

উত্তর:


249

এটি একটি উদাহরণ দিয়ে সেরা চিত্রিত হতে পারে। আসুন যাক findএই ফাইলগুলি সক্রিয় করে:

file1
file2
file3

-execএকটি সেমিকোলন ( find . -exec ls '{}' \;) ব্যবহার করে কার্যকর করা হবে

ls file1
ls file2
ls file3

তবে আপনি যদি এর পরিবর্তে প্লাস চিহ্ন ( find . -exec ls '{}' \+) ব্যবহার করেন তবে যতটা সম্ভব ফাইলের নাম একটি একক কমান্ডে যুক্তি হিসাবে পাস করা হবে:

ls file1 file2 file3

ফাইলের নাম সংখ্যা কেবলমাত্র সিস্টেমের সর্বাধিক কমান্ড লাইনের দৈর্ঘ্যের দ্বারা সীমাবদ্ধ। কমান্ডটি যদি এই দৈর্ঘ্য অতিক্রম করে, কমান্ডটি একাধিকবার কল করা হবে।


1
ধন্যবাদ। ফলস্বরূপ ফাইলগুলি বাছাই করার জন্য এটি খুব দরকারী: -ম্যাক্সডেপথ 1-টাইপ এফ-মিমটাইম -1-এক্সেক এলএস -ltr {} \ +
fbas

1
বোবা প্রশ্ন: আমি লক্ষ্য করেছি যে এর সাথে +যুক্ত -execসর্বদা পালিয়ে যায়, তবে এর +সাথে সম্পর্কিত -mtimeহয় না। আপনি কি কারণ জানেন? আমার ধারণা, এর ;সাথে যুক্ত হওয়া থেকে পালানো অভ্যাস -exec
কেভিনারপে

3
@ কেভিনার্পে সত্যই, আমি এটিকে অভ্যাস থেকে চক করে দেব ;। কখনই পালানো দরকার তা কল্পনা করতে পারবেন না+
মার্টিন

36

এখনও অবধি সমস্ত উত্তর সঠিক। আমি এটির echoপরিবর্তে ব্যবহার করে বর্ণিত আচরণের পরিষ্কার (আমার কাছে) প্রদর্শন হিসাবে এটি অফার করিls :

একটি সেমিকোলনের সাহায্যে কমান্ডটি echoএকবারে ফাইল (বা অন্যান্য ফাইল সিস্টেম অবজেক্ট) পাওয়া যায়:

$ find . -name 'test*' -exec echo {} \;
./test.c
./test.cpp
./test.new
./test.php
./test.py
./test.sh

একটি প্লাস সহ, কমান্ডটি echoকেবল একবার কল করা হয়। পাওয়া প্রতিটি ফাইল একটি যুক্তি হিসাবে পাস করা হয়।

$ find . -name 'test*' -exec echo {} \+
./test.c ./test.cpp ./test.new ./test.php ./test.py ./test.sh

যদি findবিপুল সংখ্যক ফলাফলের সন্ধান করে তবে আপনি দেখতে পাবেন যে কমান্ডটি আর্গুমেন্টের সংখ্যাকে চোকস বলেছে।


1
ফলাফলগুলি কেবল কোনও সংখ্যার সাথে যুক্ত করা সন্ধান করা উচিত নয় যা এটি শেলটিতে পাস করা নিরাপদ করে? অন্তত কি xargsহয় ... নীতিগতভাবে এটি কখনই খুব বেশি যুক্তি দেখায় না।
রোমানো

1
@ রুমানো: সোলারিসে আমি find(এবং xargs) দেখেছি যে পরিমাণে বেশি যুক্তি সেবন করা যায়। GNU- এর Findutilstil-xargs(এবং find) আরও সংবেদনশীল আচরণ করেছে বলে মনে হয়, তবে প্রত্যেকে GNU ব্যবহার করে না।
জনসিওয়েব

2
@ জনসইয়েব, সমস্ত পসিএক্স findআর্গুমেন্টের সংখ্যার সীমাতে পৌঁছানোর চেষ্টা করবে। এবং এর মধ্যে সোলারিস অন্তর্ভুক্ত রয়েছে (অন্তত 10)। যেখানে এটি ব্যর্থ হতে পারে তা হ'ল যদি আপনি এর মতো কিছু করেন find ... -exec ksh -c 'cmd "$@" "$@"' sh {} +বা করেন find ... -exec ksh -c 'files="$*" cmd "$@"' sh {} +তবে এর findজন্য সত্যিই দোষ দেওয়া যায় না। নোট করুন যে GNU findহ'ল findসমর্থনের শেষ প্রয়োগসমূহের মধ্যে +একটি (জিএনইউ সিস্টেমে পোর্ট স্ক্রিপ্টে ব্যথা হিসাবে ব্যবহৃত হত)।
স্টিফেন চেজেলাস

18

থেকে man find:

-exec আদেশ;

আদেশ কার্যকর; যদি 0 স্ট্যাটাস ফিরে আসে তবে সত্য true ';' 'যুক্ত একটি যুক্তি না পাওয়া পর্যন্ত অনুসন্ধানের জন্য নিম্নলিখিত সমস্ত যুক্তি কমান্ডের আর্গুমেন্ট হিসাবে নেওয়া হবে; সম্মুখীন হয়। '{}' স্ট্রিংটি বর্তমান ফাইলের নাম দ্বারা প্রসেস করা হচ্ছে যেখানেই এটি কমান্ডের আর্গুমেন্টগুলিতে ঘটে সেখানেই যুক্ত করা হয়, যেখানে এটি একা রয়েছে কেবল তত যুক্তিগুলিতে নয়, যেমন অনুসন্ধানের কয়েকটি সংস্করণে রয়েছে। এই দুটি নির্মাণই শেল দ্বারা সম্প্রসারণ থেকে রক্ষা করতে ('\' সহ) বা উদ্ধৃত হওয়া প্রয়োজন হতে পারে। '-Exec' বিকল্পের ব্যবহারের উদাহরণগুলির জন্য উদাহরণ সেকশন বিভাগটি দেখুন। নির্দিষ্ট কমান্ডটি প্রতিটি ম্যাচ করা ফাইলের জন্য একবার চালানো হয়। কমান্ডটি শুরু ডিরেক্টরিতে কার্যকর করা হয়। অ-নিরাপদ বিকল্পটি ব্যবহারের চারপাশে অনিবার্য সুরক্ষা সমস্যা রয়েছে;

-exec কমান্ড {} +

-Exec বিকল্পের এই রূপটি নির্বাচিত ফাইলগুলিতে নির্দিষ্ট কমান্ড চালায়, তবে প্রতিটি নির্বাচিত ফাইলের নাম শেষে অন্তর্ভুক্ত করে কমান্ড লাইনটি নির্মিত হয় ; কমান্ডের অনুরোধের মোট সংখ্যা মিলিত ফাইলগুলির সংখ্যার তুলনায় অনেক কম হবে। কমান্ড লাইনটি একইভাবে নির্মিত হয়েছে যেমন xargs তার কমান্ড লাইনগুলি তৈরি করে। কমান্ডের মধ্যে '{}' কেবলমাত্র একটি উদাহরণ অনুমোদিত। কমান্ডটি শুরু ডিরেক্টরিতে কার্যকর করা হয়।

সুতরাং, আমি এটি যেভাবে বুঝতে পারি তার \;দ্বারা প্রাপ্ত প্রতিটি ফাইলের জন্য একটি পৃথক কমান্ড কার্যকর করে find, যেখানে \+ফাইলগুলি সংযোজন করা হয় এবং সেগুলির উপরে একটি একক কমান্ড কার্যকর করে। \, একটি পালাবার চরিত্র তাই এটি আছে:

ls testdir1; ls testdir2 

বনাম

ls testdir1 testdir2

আমার শেলটিতে উপরেরটি করা আপনার প্রশ্নের আউটপুটকে মিরর করেছে।

আপনি কখন ব্যবহার করতে চান তার উদাহরণ \+

ধরুন, দুটি ফাইল 1.tmpএবং 2.tmp:

1.tmp:

1
2
3

2.tmp:

0
2
3

সহ \;:

 find *.tmp -exec diff {} \;
> diff: missing operand after `1.tmp'
> diff: Try `diff --help' for more information.
> diff: missing operand after `2.tmp'
> diff: Try `diff --help' for more information.

আপনি যদি ব্যবহার করেন তবে \+(এর ফলাফলগুলি বোঝাতে find):

find *.tmp -exec diff {} \+
1c1,3
< 1
---
> 0
> 2
> 30

তাই এই ক্ষেত্রে এটি পার্থক্য diff 1.tmp; diff 2.tmpএবংdiff 1.tmp 2.tmp

কিছু ক্ষেত্রে রয়েছে যেখানে \;উপযুক্ত এবং \+প্রয়োজনীয় হবে। এর সাথে ব্যবহার \+করা rmএমন একটি উদাহরণ, যেখানে আপনি যদি প্রচুর পরিমাণে ফাইলের পারফরম্যান্স (গতি) সরিয়ে ফেলেন তবে এর চেয়ে সেরা হবে \;


আমি ম্যান পৃষ্ঠাটিও পড়তে পারি। এবং আমি করেছি, তবে আমি মনে করি না যে আমি ব্যবহারের মধ্যে পার্থক্য বুঝতে পেরেছি; বনাম +
অঙ্কুর আগরওয়াল

আমি মনে করি না যে -1 ন্যায্য ছিল, আমি আমার লোকটির আধিক্য ব্যাখ্যা করেছি। আমি শুধু লোকটিকে অনুলিপি করে চলে গেলাম না। তবে আমি আরও ভাল উদাহরণ অন্তর্ভুক্ত করার জন্য আমার প্রতিক্রিয়া সম্পাদনা করেছি।
ম্যাচিউ

10

findবিশেষ বাক্য গঠন আছে। আপনি ব্যবহার{} যেমনটি সেহেতু তাদের খুঁজে পাওয়া ফাইলের পাথের নাম হিসাবে সন্ধান করার অর্থ রয়েছে এবং (বেশিরভাগ) শেলগুলি অন্যথায় তাদের ব্যাখ্যা করে না। আপনার ব্যাকস্ল্যাশ দরকার \;কারণ সেমিকোলনের শেলটির অর্থ রয়েছে যা এটি findপাওয়ার আগে এটি খায় । কি তাই findপরে শেল আর্গুমেন্ট তালিকার সি প্রোগ্রাম প্রেরণ সালে সম্পন্ন করা হয় দেখতে চায়, হয়

"-এক্সেক", "আরএম", "{}", ";"

তবে \;আর্গুমেন্টের শেলটি দিয়ে একটি সেমিকোলন পেতে আপনার কমান্ড লাইনে থাকা দরকার ।

\{\}শেল-উদ্ধৃত ব্যাখ্যার কারণে আপনি এড়াতে পারবেন\{\} কেবলমাত্র {}। একইভাবে, আপনি '{}' ব্যবহার করতে পারেন।

আপনি যা করতে পারবেন না তা হ'ল ব্যবহার

 -exec 'rm {} ;'

শেল যে এক হিসাবে এটি ব্যাখ্যা করে যুক্তি ,

"-এক্সেক", "আরএম {};"

এবং rm {} ;কোনও আদেশের নাম নয়। (যদি না কেউ সত্যিকারের দিকে ঝুঁকছে না))

হালনাগাদ

পার্থক্য এর মধ্যে

$ ls file1
$ ls file2

এবং

$ ls file1 file2

+একটি কমান্ড লাইন সম্মুখের নাম catenating করা হয়।


1
আমি বুঝতে পারছি তুমি কি বলছ। আমি জিজ্ঞাসা করছি কি ব্যবহারের মধ্যে পার্থক্য; বনাম +
অঙ্কুর আগরওয়াল

1
দুঃখিত, তবে আপনি কি আমার প্রশ্নটি বা আমার মন্তব্য মনোযোগ দিয়ে পড়েছেন? আমার এটি পুনরায় নতুন করে দেওয়া দরকার হতে পারে। আমি যখন সন্ধানে এক্সিকিউটিভের সাথে প্লাস ব্যবহার করি তখন সন্ধানের বিপরীতে এক্সিকিউটিভের সাথে সেমিকোলন ব্যবহার করি কেন সেখানে আলাদা ও / পি আছে?
অঙ্কুর আগরওয়াল

2
কমান্ডটি এরকম কেন এটির জন্য এটি একটি দুর্দান্ত ব্যাখ্যা, যা গৃহীত উত্তরটি আবৃত করে না। ধন্যবাদ!
শেরউইন ইউ

1

;(সেমিকোলন) বা +(প্লাস চিহ্ন) এর মধ্যে পার্থক্য হ'ল কীভাবে আর্গুমেন্টগুলি অনুসন্ধানের -exec/ -execdirপ্যারামিটারে যায় passed উদাহরণ স্বরূপ:

  • ব্যবহার করে ;একাধিক কমান্ড কার্যকর করা হবে (প্রতিটি যুক্তির জন্য পৃথকভাবে),

    উদাহরণ:

    $ find /etc/rc* -exec echo Arg: {} ';'
    Arg: /etc/rc.common
    Arg: /etc/rc.common~previous
    Arg: /etc/rc.local
    Arg: /etc/rc.netboot
    

    নিম্নলিখিত সমস্ত যুক্তি find কমান্ডের আর্গুমেন্ট হিসাবে নেওয়া হয়।

    স্ট্রিংটি {}বর্তমান ফাইলের নাম দ্বারা প্রক্রিয়া করা হচ্ছে।

  • ব্যবহার +কমপক্ষে সম্ভাব্য কমান্ডগুলি কার্যকর করবে (যেমন যুক্তিগুলি একত্রিত করা হয়)। xargsকমান্ড কীভাবে কাজ করে এটির সাথে এটি একই রকম , সুতরাং লাইন প্রতি আর্গুমেন্টের সর্বাধিক সীমা ছাড়িয়ে যাওয়ার জন্য এটি যতটা সম্ভব কমান্ড হিসাবে অনেক আর্গুমেন্ট ব্যবহার করবে।

    উদাহরণ:

    $ find /etc/rc* -exec echo Arg: {} '+'
    Arg: /etc/rc.common /etc/rc.common~previous /etc/rc.local /etc/rc.netboot
    

    কমান্ড লাইনটি প্রতিটি নির্বাচিত ফাইলের নাম শেষে যুক্ত করা হয়।

    {}কমান্ডের মধ্যে কেবলমাত্র একটি উদাহরণ অনুমোদিত।

আরো দেখুন:


-5

আমরা গৃহকর্মের জন্য ফাইল সন্ধান করার চেষ্টা করছিলাম।

অনুসন্ধান . -Eexec প্রতিধ্বনি {} \; কমান্ড শেষ পর্যন্ত কোন ফলাফল নেই।

অনুসন্ধান . -Eecec প্রতিধ্বনি {} \ + এর ফলাফল রয়েছে এবং কেবল কয়েক ঘন্টা সময় নিয়েছে।

আশাকরি এটা সাহায্য করবে.


2
এই উত্তরটি ব্যাখ্যা করে না যে কীভাবে এই দুটি উপায় কাজ করে এবং কীভাবে তাদের দ্বারা উত্পাদিত ফলাফলগুলি পৃথক হয়।
Misko321
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.