মুড়ুর উত্তর উপযুক্ত এবং উপযুক্ত ক্ষেত্রে উপযুক্ত যেখানে ফাইল পাওয়া গেলে আমরা কিছু মুদ্রণ করতে চাই। সাধারণ ক্ষেত্রে যখন আমরা বাহ্যিক কমান্ড কার্যকর করতে চাই, যেমন echo
আমরা -exec
পতাকা ব্যবহার করতে পারি ।
$ find . -name 'xac' -exec echo "I found " {} \; -quit
I found ./xac
{}
অংশ মধ্যে কমান্ড ফাইলের নাম পাসের -exec
এবং \;
আর্গুমেন্ট হিসাবে। \
পূর্বে নোট করুন ;
- এটি শেলটি এর ভুল ব্যাখ্যা থেকে বাধা দেয় shell শেল সমাপ্তি সেমিকোলন কমান্ডের সমাপ্তি নির্দেশ করে, তবে স্ল্যাশ সহ পালাতে গেলে শেল এটিকে আক্ষরিক পাঠ্যটি find
কমান্ডে পাঠানো এবং আজ্ঞার সন্ধানের জন্য চিহ্নিত করবে যা -exec
পতাকাটির যুক্তি বন্ধ করে দেবে ।
if found do this; else do that
সাজানোর শর্ত তৈরি করার জন্য , আমরা কমান্ড সাবস্টিটিশন $()
এবং test
কমান্ড (ওরফে [
) ব্যবহার করতে পারি :
$ [ "x$(find . -name 'noexist' -print -quit)" != "x" ] && echo "found" || echo "not found"
not found
$ [ "x$(find . -name 'xac' -print -quit)" != "x" ] && echo "found" || echo "not found"
found
ড্যানের মন্তব্যে সম্বোধন করা
ড্যান মন্তব্য করা জিজ্ঞাসা:
"আমি খুঁজে পেয়েছি cho e" প্রতিধ্বনি "আমি খুঁজে পেয়েছি" {} এর চেয়ে ভাল হবে না? প্রতিধ্বনির জন্য এটি ঠিক আছে তবে কেউ যদি কমান্ডটি অনুলিপি করে এবং প্রতিস্থাপন করে অন্য কমান্ডের সাথে প্রতিস্থাপন করে, তাদের সমস্যা হতে পারে
প্রথমে সমস্যাটি বুঝতে পারি understand সাধারণত শেলগুলিতে শব্দের বিভাজনের ধারণা রয়েছে, যার অর্থ অনাবৃত ভেরিয়েবল এবং অবস্থানগত পরামিতিগুলি বিস্তৃত হবে এবং আলাদা আইটেম হিসাবে বিবেচিত হবে। উদাহরণস্বরূপ, যদি আপনি পরিবর্তনশীল আছে var
এবং এটা রয়েছে hello world
পাঠ্য, যখন আপনি কি করতে touch $var
শেল এটি ডাউন দুটি পৃথক আইটেম মধ্যে বিরতি হবে hello
এবং world
এবং touch
বুঝতে হবে যে হিসাবে আপনি যদি 2 পৃথক ফাইল তৈরি করার চেষ্টা করা হয়েছে; যদি আপনি এটি করেন touch "$var"
তবে শেলটি hello world
একটি ইউনিট হিসাবে বিবেচিত touch
হবে এবং কেবল একটি ফাইল তৈরি করবে। এটি বুঝতে গুরুত্বপূর্ণ যে শেলগুলি কীভাবে কাজ করে তা কেবল এটির কারণে ঘটে।
বিপরীতে, find
এই জাতীয় আচরণে ভোগেন না, কারণ আদেশগুলি find
নিজেই প্রক্রিয়াজাত হয় এবং execvp()
সিস্টেম কল দ্বারা সম্পাদিত হয় , তাই কোনও শেল জড়িত নেই। কোঁকড়া ধনুর্বন্ধনী এর শেলগুলির বিশেষ অর্থ রয়েছে, কারণ তারা find
কমান্ডের মাঝামাঝি সময়ে উপস্থিত হয় এবং শুরুতে নয়, তারা এই ক্ষেত্রে শেলের কোনও বিশেষ অর্থ বহন করে না। এখানে একটি উদাহরণ। আসুন কয়েকটি কঠিন ফাইলের নাম তৈরি করুন এবং stat
কমান্ডের আর্গুমেন্ট হিসাবে তাদের পাস করার চেষ্টা করুন ।
$ touch with$'\t'tab.txt with$' 'space.txt with$'\n'newline.txt
$ find -type f -exec stat -c "%F" {} \; -print
regular empty file
./with?newline.txt
regular empty file
./with space.txt
regular empty file
./with?tab.txt
আপনি দেখতে পাচ্ছেন, হার্ড stat
ফাইলনামগুলি পুরোপুরি সূক্ষ্মভাবে পান find
, এটি পোর্টেবল স্ক্রিপ্টগুলিতে ব্যবহারের জন্য সুপারিশ করার মূল কারণগুলির মধ্যে একটি এবং বিশেষত দরকারী যখন আপনি ডিরেক্টরি গাছের সন্ধান করছেন এবং সম্ভবত ফাইলের সাথে কিছু করতে চান তাদের মধ্যে বিশেষ অক্ষর। সুতরাং, কমান্ড কমান্ডগুলির জন্য কোঁকড়া ধনুর্বন্ধনী উদ্ধৃত করার প্রয়োজন হয় না find
।
শেল জড়িত হয়ে গেলে এটি আলাদা গল্প। কখনও কখনও আপনার ফাইলের নাম প্রক্রিয়া করতে শেল ব্যবহার করা প্রয়োজন। সেক্ষেত্রে উদ্ধৃতি দেওয়া সত্যই গুরুত্বপূর্ণ, তবে এটি উপলব্ধি করা গুরুত্বপূর্ণ যে এটির সমস্যাটি খুঁজে পাওয়া যায় না - এটি শেল যা শব্দ বিভাজন করে।
$ find -type f -exec bash -c "stat {}" sh \;
stat: cannot stat './with': No such file or directory
sh: line 1: newline.txt: command not found
stat: cannot stat './with': No such file or directory
stat: cannot stat 'space.txt': No such file or directory
stat: cannot stat './with': No such file or directory
stat: cannot stat 'tab.txt': No such file or directory
সুতরাং আমরা যখন শেল মধ্যে উদ্ধৃতি , এটি কাজ করবে। কিন্তু আবার, এটি শেলের জন্য গুরুত্বপূর্ণ, না find
।
$ find -type f -exec bash -c "stat -c '%F' '{}'" sh \;
regular empty file
regular empty file
regular empty file
/some/path
কোথায় সন্ধান শুরু করবেন তা জানায়, তবে কী সন্ধান করা উচিত তা কিছুই বলে না। আপনার লিঙ্কিত উত্তরে একই। আমার জন্য কাজ করে কিfind /some/path -name xac -print0 -quit | grep -qz . && echo found
। আমি কি কিছু রেখে গেলাম?