লিনাক্স কমান্ডে "{} \;" এর অর্থ কী?


37

কখনও কখনও আমি নিম্নলিখিত আদেশটি দেখতে পাই:

find . -name  * -exec ls -a {} \;

আমাকে এটি সম্পাদন করতে বলা হয়েছিল।

{} \;এখানে মানে কি ?


1
-name *অপ্রয়োজনীয়।
কেভিন


8
-name *অপ্রয়োজনীয় চেয়ে খারাপ। যেহেতু *অচিহ্নযুক্ত, শেলটি এটিকে বর্তমান ফোল্ডারে ফাইলের নামের তালিকায় প্রসারিত করে, ফাঁকা স্থানগুলি ভুলভাবে চিকিত্সা করা হয়, যার ফলে অপ্রত্যাশিত ফলাফল বা ত্রুটি বার্তা দেখা যায়। অতিরিক্ত পয়েন্ট হিসাবে, findঅনেকগুলি ফাংশন রয়েছে, যার মধ্যে একটি ফাইল তালিকাভুক্ত করা হচ্ছে; এটি ব্যবহার করা এড়ানো -exec। যেমন, আপনি ব্যবহার করতে পারেন find . -printবা find . -ls। হয় আপনি ব্যাকস্ল্যাশ সঙ্গে করেনি: অবশেষে, সেখানে আধা কোলন অব্যাহতি দুটি উপায় আছে \;, বা মূল্য উদ্ধৃতি দ্বারা: ';'। আপনি যাকে আরও স্বাচ্ছন্দ্যবোধ করেন তা ব্যবহার করুন।
ধানের ল্যান্ডাউ

উত্তর:


48

আপনি চালাতে পারেন findসঙ্গে exec, {}প্রতিটি ফাইল বা ডিরেক্টরির খুঁজে পাওয়া পৃষ্ঠাগুলোর ফাইলের নাম থেকে বিস্তৃতি find(যাতে lsআপনার উদাহরণে একটি আর্গুমেন্ট হিসাবে যে খুঁজে পাওয়া যায় নি ফাইলের নাম পায় - মনে রাখবেন কল lsবা যাই হোক না কেন অন্য কমান্ড আপনাকে একবার প্রতিটি ফাইল পাওয়া উল্লেখ করুন)।

সেমিকোলন ;দ্বারা চালিত কমান্ডটি শেষ করে exec। এটি দিয়ে পালাতে হবে \যাতে আপনি findভিতরে যে শেলটি চালাচ্ছেন এটি এটিকে তার নিজস্ব বিশেষ চরিত্র হিসাবে বিবেচনা করে না, বরং এটি এতে প্রবেশ করে find

আরও কিছু তথ্যের জন্য এই নিবন্ধটি দেখুন ।


এছাড়াও, এর findসাথে কিছু অপ্টিমাইজেশন সরবরাহ করে exec cmd {} +- যখন findএটির মতো চালানো হয়, প্রতি ফাইল প্রতি একবার অনুরোধ না করে কমান্ডের শেষে ফাইলগুলি সংযোজন করা হয় (যাতে সম্ভব হলে কমান্ডটি কেবল একবার চালানো হয়)।

আচরণের পার্থক্য (দক্ষতায় না থাকলে) সহজে চালানো যায় যদি চালানো হয় ls, যেমন

find ~ -iname '*.jpg' -exec ls {} \;
# vs
find ~ -iname '*.jpg' -exec ls {} +

ধরে নিলাম আপনার কাছে কিছু jpgফাইল রয়েছে ( সংক্ষিপ্ত পর্যায়ে পাথ সহ ), ফলাফলটি প্রথম ক্ষেত্রে প্রতি ফাইলের জন্য একটি লাইন এবং lsপরবর্তী কলামগুলিতে ফাইলগুলি প্রদর্শন করার মানক আচরণ।


1
আমার মনে হয় এটা উপকারী আপনি বিপরীতে জন্য হবে \;সঙ্গে +
কেভিন

কিভাবে এটি থেকে আলাদা find . -name * | ls -a -?
অ্যান্ড্রেস হামার

@ ডিআরএইচ, বিন্দুটি শেলটি ওয়াইল্ডকার্ড সম্প্রসারণ করতে নয় বরং ওয়াইল্ডকার্ডের অভিব্যক্তিটি পাস করতে হবে find। এছাড়াও, আউটপুট lsএই ক্ষেত্রে দৃশ্যত ইনপুট উপর নির্ভর করে না - কোন ব্যাপার কি আমি একটি ফিল্টার হিসাবে ব্যবহার find, lsশুধু প্রদর্শন কাজ ডিরেক্টরি বিষয়বস্তু এবং যে সব। find ~ -iname '*.jpg' -exec ls -a {} \;বনাম উদাহরণস্বরূপ পরীক্ষা করুন find ~ -iname '*.jpg' | ls -a
moon.musick

@ ডিআরএইচ বা এমনকি echo 'foo' | ls -a
moon.musick

@ মুন.মুসিক, আমি বিশ্বাস করি যে @ ডাঃ এইচ কি জিজ্ঞাসা করেছিল তা পরীক্ষা করার সময় -আপনি আপনার ls -a -কমান্ডের গুরুত্বপূর্ণ বিষয়টি বাদ দিয়েছেন ।
ড্যানিয়েল ল্যাভল্লিন

20

কমান্ডের ম্যানপেজfindম্যানপেজ আইকন থেকে :

-exec command ;
              Execute  command;  true if 0 status is returned.  All following arguments to find are taken to be arguments to
              the command until an argument consisting of `;' is encountered.  The string `{}' is replaced  by  the  current
              file name being processed everywhere it occurs in the arguments to the command, not just in arguments where it
              is alone, as in some versions of find.  Both of these constructions might need to be escaped (with a  `\')  or
              quoted  to  protect them from expansion by the shell.

সুতরাং এখানে ব্যাখ্যা:

{}এর অর্থ "আউটপুট find"। হিসাবে, "যা কিছু findপাওয়া যায়"। findআপনি যে ফাইলটির সন্ধান করছেন তার পথটি ফিরিয়ে দেয়, তাই না? সুতরাং {}এটি প্রতিস্থাপন; findকমান্ডটি চিহ্নিত করে এমন প্রতিটি ফাইলের জন্য এটি স্থানধারক ( এখান থেকে নেওয়া )।

\;অংশ মূলত বলছে find"ঠিক আছে, আমি কমান্ড আমি চালানো চেয়েছিলেন সাথে কাজ করছি"।

উদাহরণ:

ধরা যাক আমি .txtফাইলগুলিতে পূর্ণ একটি ডিরেক্টরিতে আছি । আমি তখন চালাব:

find . -name  '*.txt' -exec cat {} \;

প্রথম অংশটি, ফাইলগুলির find . -name *.txtএকটি তালিকা প্রদান করে .txt। দ্বিতীয় অংশ, -exec cat {} \;চালানো হবে catপাওয়া যে ফাইলের জন্য কমান্ড findতাই হয়, cat file1.txt, cat file2.txt, ইত্যাদি।


4
অংশ *.txtহিসাবে উদ্ধৃত করা আবশ্যক '*.txt'। এটি কারণ যদি .txtবর্তমান ফোল্ডারে ফাইল থাকে তবে শেলটি এটি প্রসারিত করবে এবং আপনি ভুল ফলাফল বা ত্রুটি বার্তা পাবেন। find -name '*.txt' -exec cat {} \;
ধানের ল্যান্ডাউ

@ আলা আলী খুব ভালভাবে ব্যাখ্যা করেছেন
পুশ্যা 5'15
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.