"খুঁজে" কোনও মিল খুঁজে পেয়েছে কিনা তা কীভাবে সনাক্ত করবেন?


16

"খুঁজে পাওয়া" কোনও মিল খুঁজে পেয়েছে কিনা তা সনাক্ত করার কোনও প্রতিমা যুক্ত উপায় আছে কি? আমি বর্তমানে ব্যবহার করছি

COUNT=`find ... | wc -l`
if [ "$COUNT" -gt 0 ]; then

তবে এটি আমার কাছে কিছুটা অপ্রত্যক্ষ বলে মনে হচ্ছে। এছাড়াও, আমি একবার মিল খুঁজে পেয়ে অনুসন্ধান বন্ধ করতে চাই, যাতে এটি সময় এবং প্রচেষ্টা নষ্ট করে না। আমার কেবল কোনও ফাইলের সাথে মেলে কিনা তা জানতে হবে।

আপডেট: আমার সামনে কোডটি না দিয়ে আমার প্রশ্নটি লেখার ভুল করেছিলাম: আমি wc -lঅন্য ক্ষেত্রে ব্যবহার করি , যেখানে আমাকে যেভাবে পাওয়া ফাইলের মোট সংখ্যা জানতে হবে। কেস যেখানে আমি শুধু আছে কিনা কোনো মিল হয় পরীক্ষা করছি, আমি ব্যবহার ছিল if [ -z $(find …) ]

উত্তর:


17

আপনি যদি জানেন যে আপনার জিএনইউ রয়েছে, -quit তবে প্রথম ম্যাচের পরে এটি বন্ধ করতে ব্যবহার করুন ।

Portably, পাইপ আউটপুট findমধ্যে head -n 1findকিছু ম্যাচের পরে (যখন এটির headইনপুট বাফারটি পূর্ণ হয় ) ভাঙ্গা পাইপের ফলে সেভাবে মারা যাবে ।

যে কোনও উপায়ে, আপনার wcকোনও স্ট্রিং ফাঁকা আছে কিনা তা পরীক্ষা করার দরকার নেই , শেলটি নিজে থেকে এটি করতে পারে।

if [ -n "$(find … | head -n 1)" ]; then …

আকর্ষণীয় ... আমি ভেবেছিলাম -nকেবলমাত্র 'সংজ্ঞায়িত' ভেরিয়েবল ($ এবিসি, $ এক্সআইজেড, ইত্যাদি) এ প্রয়োগ করা হয়েছে তবে আমি মনে করি $ (...) একটি 'সংজ্ঞায়িত' টেম্প ভেরিয়েবল .. +1 ... (এবং আমি কেবল সম্প্রতি পড়ুন যে -nব্যবহারটি ঝুঁকিপূর্ণ, যদি না আপনি নিশ্চিত হন যে ভেরিয়েবলটি ইতিমধ্যে ঘোষণা করা হয়নি এবং 'অব্যবহৃত) ... তবে কোনও অস্থির এই সম্ভাবনা থাকবে না ... অর্থাৎ।
অবিচ্ছিন্ন

2
@ ফ্রেড: বিপরীতে, -nস্ট্রিং খালি কিনা তা পরীক্ষা করে, ভেরিয়েবলগুলির সাথে এর কোনও যোগসূত্র নেই। আপনি যা পড়েছেন সম্ভবত -nএটিই বলছিল যে ভেরিয়েবল সংজ্ঞায়িত করা হয়েছে কিনা তা পরীক্ষা করে পরীক্ষা করা হয় না: সংজ্ঞায়িত হলেও খালি -n "$foo"থাকলে মিথ্যা fooএবং এর অধীনে একটি ত্রুটি বার্তা প্রদর্শিত হয় set -u[ -n "${foo+1}" ]নির্ভরযোগ্যভাবে fooসেট করা আছে কিনা তা পরীক্ষা করে , তবে খালি এবং আনসেট ভেরিয়েবলগুলি অভিন্নভাবে চিকিত্সা করা ভাল ধারণা: [ -n "${foo:+1}" ]বা [ -n "$foo" ]আপনি যদি উদ্বিগ্ন না হন তবেই set -u
গিলস 'অশুভ হওয়া বন্ধ করুন'

ধন্যবাদ! আমার কাছে -quitউপলব্ধ নেই, তবে head -n 1কাজ করার জন্য পাইপিং করছে (যেমনটি হয় head -c 1, যা আগেও থামে, তবে সম্ভবত উপেক্ষিত সুবিধা)। এছাড়াও, আমার সামনে কোডটি ছাড়াই আমার প্রশ্নটি লেখার ভুল হয়েছিল: আমি wc -lঅন্য ক্ষেত্রে ব্যবহার করি , যেখানে আমাকে পাওয়া ফাইলগুলির মোট সংখ্যা জানতে হবে। কেস যেখানে আমি শুধু আছে কিনা কোনো মিল হয় পরীক্ষা করছি, আমি ব্যবহার ছিল if [ -z `find … ` ]
ক্রিস পেজ

6

আপনি -quitপ্রথম ম্যাচের পরে থামার জন্য অ্যাকশনটি ব্যবহার করতে পারেন । আপনি সম্ভবত এটি অন্য কোনও ক্রিয়া (যেমন -print) এর সাথে একত্রিত করতে চাইবেন বা এটি কোনও কিছু পাওয়া গেছে কিনা তা আপনি বলতে সক্ষম হবেন না।

উদাহরণস্বরূপ, find ... -print -quitপ্রথম মিলিত ফাইলের পাথটি মুদ্রণ করবে এবং তারপরে প্রস্থান করবে। বা, -printf 1 -quitকোনও মিল থাকলে আপনি 1 টি মুদ্রণ করতে ব্যবহার করতে পারেন এবং যদি কিছু না থাকে তবে কিছু।

findঅনুসন্ধানের সময় ত্রুটি ছিল কিনা এবং এটি কোনও কিছু খুঁজে পেয়েছিল কিনা তা প্রতিফলনের স্থিতিটি প্রতিফলিত করে, তাই কোনও মিল আছে কিনা তা দেখার জন্য আপনাকে এর আউটপুটটি পরীক্ষা করতে হবে।


-quitএকটি জিএনইউ এক্সটেনশন। এটি ওএস এক্স, বিএসডি এবং সম্ভবত বেশিরভাগ বাণিজ্যিক ইউনিটগুলির মতো ফাইন্ড (1) এর অন্যান্য প্রয়োগগুলি ব্যবহার করে সিস্টেমে কাজ করবে না।
ওয়ারেন ইয়ং

ধন্যবাদ, আমি অন্য সিস্টেমটি ব্যবহার করছি সে ক্ষেত্রে এটি জেনে রাখা কার্যকর। দুর্ভাগ্যক্রমে, না-ছাড় বা -প্রিন্টফ আমার (ম্যাক ওএস এক্স) এ উপলব্ধ নয়।
ক্রিস পেজ

4

প্রস্থান 0 অনুসন্ধানের সাথে সহজ, প্রস্থান> 0 আরও কঠিন কারণ এটি কেবলমাত্র ত্রুটির সাথে ঘটে। তবে আমরা এটি ঘটতে পারি:

if find -type f -exec false {} +
then
  echo 'nothing found'
else
  echo 'something found'
fi

নোট করুন যে এই সমাধানটি সাবসেল ব্যবহারের চেয়ে বেশি পারফরম্যান্সযুক্ত; মিথ্যা কার্যকর করা অবশ্যই ড্যাশ কার্যকর করার চেয়ে দ্রুত:

$ cat alfa.sh bravo.sh charlie.sh delta.sh
find -name non-existing-file -exec false {} +
find -name existing-file -exec false {} +
[ "$(find -name non-existing-file)" ]
[ "$(find -name existing-file)" ]

$ strace dash alfa.sh | wc -l
807

$ strace dash bravo.sh | wc -l
1141

$ strace dash charlie.sh | wc -l
1184

$ strace dash delta.sh | wc -l
1194

0

আপনি এটিকে শেল অবস্থায় আবৃত করতে পারেন, যেমন:

[ "$(find . ...)" '!=' '' ] && echo Found || echo Not found

...আপনার মিলের অবস্থাটি কোথায় -name *.txt?

আরও কয়েকটি উদাহরণ:

[ "$(find /etc -name hosts)" ] && echo True || echo False
[ ! -z "$(find /etc -name hosts)" ] && echo True || echo False
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.