কমান্ডের পরে সংযোজকগুলি ব্যবহার করা


10

আমি চাইছি আমার বাশ ফাইন্ড কমান্ডটি ব্যবহার করে কেবল কিছু পাওয়া গেলে 'পাওয়া' মুদ্রণ করুক। তবে && ব্যবহার করে কোনও লাভ হয় না: এমনকি কিছু না পাওয়া গেলেও আমি 'খুঁজে পেয়েছি' মুদ্রিত হয়ে যাচ্ছি। উদাহরণ:

$ pwd
/data/data/com.termux/files/home/test/test1/test4
$ ls
xaa  xab
$ find . -name xac && echo 'found'
found
$ find . -name xaa && echo 'found'
./xaa
found

উত্তর:


18

আপনি findনিজে মুদ্রণ করতে পারেন found:

find . -name xac -printf "found\n" -quit

-quitকরতে হবে find প্রথম খেলা শেষে প্রস্থান , তাই foundশুধুমাত্র একবার সর্বাধিক ছাপা হয়।

ইউনিক্স এবং লিনাক্সের অনুরূপ থ্রেডে ( কিছুই না পেলে অনুসন্ধানে ব্যর্থ হয়ে দিন ), কিছুই না পেলে আমি grep -qzশূন্য-বহির্গমন স্থিতি ফিরে আসতাম find:

find /some/path -print0 -quit | grep -qz .

কোনটি আপনি ব্যবহার যৌগ কমান্ড গঠন করা ব্যবহার করতে পারেন &&বা if:

find /some/path -print0 -quit | grep -qz . && echo found

আমাকে এই মুহুর্তের দিকে তাকাতে হয়েছিল। /some/pathকোথায় সন্ধান শুরু করবেন তা জানায়, তবে কী সন্ধান করা উচিত তা কিছুই বলে না। আপনার লিঙ্কিত উত্তরে একই। আমার জন্য কাজ করে কি find /some/path -name xac -print0 -quit | grep -qz . && echo found। আমি কি কিছু রেখে গেলাম?
জো

@ জো এখানে যা গুরুত্বপূর্ণ তা তা -print0 -quit। এর আগে আপনি যা রেখেছেন তা নির্ভর করে আপনি কী অনুসন্ধান করতে চান। আমি এখানে বাদ দিতে বেছে নিয়েছি।
মুরু

13

মুড়ুর উত্তর উপযুক্ত এবং উপযুক্ত ক্ষেত্রে উপযুক্ত যেখানে ফাইল পাওয়া গেলে আমরা কিছু মুদ্রণ করতে চাই। সাধারণ ক্ষেত্রে যখন আমরা বাহ্যিক কমান্ড কার্যকর করতে চাই, যেমন 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

এর echo "I found {}"চেয়ে ভাল হবে না echo "I found " {}? প্রতিধ্বনির জন্য এটি ঠিক আছে তবে কেউ যদি কমান্ডটি অনুলিপি করে এবং প্রতিস্থাপন করে অন্য কমান্ডের সাথে প্রতিস্থাপন করে, তাদের সমস্যা হতে পারে।
ড্যান

@ ড্যান বিষয়টি মন্তব্যগুলিতে আলোচনার জন্য খুব দীর্ঘ ছিল, তাই আমি আমার উত্তরে একটি সম্পাদনা করেছি। দয়া করে এটি দেখুন
সের্গেই কলডিয়্যাজহনি

1
অবশেষে কেন সেমিকোলনটি সেখানে থাকার দরকার তা আমাকে বোঝার জন্য ধন্যবাদ। এছাড়াও, উদ্ধৃত করার দুর্দান্ত ব্যাখ্যা।
জো

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