জিএনইউ সরঞ্জাম সহ:
find . -type f -exec grep -lZ FIND {} + | xargs -r0 grep -l ME
আপনি মানকভাবে করতে পারেন:
find . -type f -exec grep -q FIND {} \; -exec grep -l ME {} \;
কিন্তু এটি ফাইলের জন্য দুটি গ্রেপ চালাবে। এতগুলি চালনা এড়াতে grepএবং এখনও ফাইলের নামগুলিতে কোনও অক্ষরকে অনুমতি দেওয়ার সময় পোর্টেবল হতে পারে, আপনি এটি করতে পারেন:
convert_to_xargs() {
sed "s/[[:blank:]\"\']/\\\\&/g" | awk '
{
if (NR > 1) {
printf "%s", line
if (!index($0, "//")) printf "\\"
print ""
}
line = $0
}'
END { print line }'
}
find .//. -type f |
convert_to_xargs |
xargs grep -l FIND |
convert_to_xargs |
xargs grep -l ME
findএক্সারগের জন্য উপযুক্ত আউটপুটটিকে রূপান্তর করার ধারণাটি (যেটি ফাঁকা (এসপিসি / টিএবি / এনএল এবং আপনার স্থানীয় স্থানের কিছু ফাঁকা কিছু বাস্তবায়নের সাথে প্রত্যাশা করে xargs)) শব্দের পৃথকীকরণের তালিকা যেখানে একক, ডাবল উদ্ধৃতি এবং ব্যাকস্ল্যাশ করতে পারে ফাঁকা ফাঁকা এবং একে অপরের)।
সাধারণত আপনি আউটপুট পোস্ট-প্রক্রিয়া করতে পারবেন না find -print, কারণ এটি ফাইলের নামগুলিকে একটি নতুন লাইন চরিত্রের সাথে পৃথক করে এবং ফাইলের নামগুলিতে পাওয়া নিউলাইন অক্ষরগুলি এড়িয়ে যায় না। উদাহরণস্বরূপ যদি আমরা দেখতে পাই:
./a
./b
আমরা কোন ভাবেই জানেন যে এটা একটি ফাইল নামক কিনা পেয়েছেন bএকটি ডিরেক্টরি নামক a<NL>.অথবা যদি এটিকে দুটি ফাইল aএবং b।
ব্যবহার করে .//., কারণ //অন্যথায় কোনও ফাইলে পাথ আউটপুট হিসাবে উপস্থিত হতে পারে না find(কারণ খালি নামের কোনও ডিরেক্টরি হিসাবে আর /কোনও ফাইলের নামে অনুমোদিত নয়), আমরা জানি যে আমরা যদি এমন একটি লাইন দেখি যা //তখন থাকে নতুন ফাইলনামের প্রথম লাইন। সুতরাং আমরা এই awkকমান্ডটি সমস্ত নতুন লাইন অক্ষর থেকে বাঁচার জন্য ব্যবহার করতে পারি তবে সেই লাইনগুলির আগে যেগুলি রয়েছে।
যদি আমরা উপরের উদাহরণটি নিই findতবে প্রথম ক্ষেত্রে (একটি ফাইল) আউটপুট আসবে:
.//a
./b
কোনটি অবতরণ করে:
.//a\
./b
সুতরাং xargsএটি একটি যুক্তি হিসাবে দেখায়। এবং দ্বিতীয় ক্ষেত্রে (দুটি ফাইল):
.//a
.//b
যা awkযেমনটি ছেড়ে যায়, তাই xargsদুটি যুক্তি দেখায়।