উত্তর:
এখানে একটি ওয়ান-লাইনার যা আমি বিশ্বাস করি যা আপনি চান তা করে:
find /tmp -name something | egrep '.*'
0
কোনও কিছুর সন্ধান পেলে প্রত্যাবর্তন স্থিতি হবে এবং অন্যথায় শূন্য নয়।
যদি আপনাকে find
আরও প্রক্রিয়াজাতকরণের আউটপুট ক্যাপচার করতে হয় তবে সোভেনের উত্তরটি এটি কভার করেছে।
find ... | read
সহজ সমাধান যা মুদ্রণ করে না, তবে ফলাফলগুলি পাওয়া গেলে 0 থেকে প্রস্থান করে
find /tmp -name something | grep -q "."
প্রস্থান 0 অনুসন্ধানের সাথে সহজ, প্রস্থান> 0 আরও শক্ত কারণ এটি সাধারণত একটি ত্রুটির সাথে ঘটে। তবে আমরা এটি ঘটতে পারি:
if find -type f -exec false {} +
then
echo 'nothing found'
else
echo 'something found'
fi
find
কোনও -exec
প্রকারের প্রস্থান কোডের উপর নির্ভর করে বলে মনে হচ্ছে না ।
exec
বিভাগে লুকানো রয়েছে , ফেরতের মূল্যের নিচে নয়)। এটি খুঁজে পাওয়া কোনও কিছুর মধ্যে পার্থক্য করতে পারে না এবং নিজেকে ত্রুটিযুক্ত খুঁজে বের করতে পারে (যেমন যখন এটি অস্তিত্বহীন প্রারম্ভিক বিন্দুতে আহ্বান করা হয়েছিল)।
পুতুলের সাথে সমস্যা সমাধানের জন্য আমার উপায় সন্ধান করার সময় এই প্রশ্নটি সন্ধান করার পরেও (ডিরেক্টরিতে কোনও ফোল্ডারে ডিরেক্টরিতে অনুমতি পরিবর্তিত হয় না) এটি কাজ করে বলে মনে হয়:
! test -z $(find /tmp -name something)
আমার নির্দিষ্ট ব্যবহারের ক্ষেত্রে এটি:
! test -z $(find /home -mindepth 1 -maxdepth 1 -perm -711)
কোন কোড 1 থেকে প্রস্থান করবে যদি ফাইন্ড কমান্ড প্রয়োজনীয় অনুমতিযুক্ত কোনও ফাইল না খুঁজে দেয়।
এটা সম্ভব না. সাফল্যের সাথে প্রস্থান করলে 0 টি রিটার্ন সন্ধান করুন, এমনকি যদি এটি কোনও ফাইল না খুঁজে পায় (যা ফাইলের প্রকৃতপক্ষে উপস্থিত না থাকে তবে ত্রুটি নির্দেশ করে না এমন একটি সঠিক ফলাফল )।
ম্যানপেজটি অনুসন্ধান করুন
স্ট্যাটাস থেকে প্রস্থান করুন
স্থিতি 0 সহ প্রস্থানগুলি সন্ধান করুন যদি সমস্ত ফাইল সফলভাবে প্রক্রিয়া করা হয় তবে ত্রুটি দেখা দিলে 0 এর চেয়ে বড়। এটি ইচ্ছাকৃতভাবে একটি বিস্তৃত বিবরণ, তবে যদি ফেরতের মান শূন্য হয় না, তবে আপনাকে ফলাফলের সঠিকতার উপর নির্ভর করতে হবে না।
আপনি কী অর্জন করতে চান তার উপর নির্ভর করে আপনি -print
ফাইলের নাম খুঁজে পেতে এবং এর আউটপুটটির বিরুদ্ধে পরীক্ষা করার চেষ্টা করতে পারেন :
#!/bin/bash
MYVAR=`find . -name "something" -print`
if [ -z "$MYVAR" ]; then
echo "Notfound"
else
echo $MYVAR
fi
exec
/ execdir
অপশনের অধীনে নথিভুক্ত করা হয়েছে (এর সাথে ব্যবহৃত +
):If any invocation returns a non-zero value as exit status, then find returns a non-zero exit status.
আমি অনুভব করি যে এটি সবচেয়ে সংক্ষিপ্ত এবং প্রত্যক্ষ পদ্ধতি:
test `find /tmp/ -name something -print -quit 2>/dev/null`
-print -quit
যা আপনার উদ্বেগের সমাধান করতে পারে।
এখানে আমি কল একটি ছোট স্ক্রিপ্ট test.py
। এটি পোস্ট করা অন্যান্য পদ্ধতির উপরে উন্নতি করে যে এটি সেট করা থাকলে এটি একটি ত্রুটি কোড প্রদান করবে এবং কোনও ফাইলের তালিকা না পেলে এটি অতিরিক্তভাবে সেট করে:
from subprocess import Popen
import sys
p = Popen(['find'] + sys.argv)
out, err = p.communicate()
if p.returncode:
sys.exit(p.returncode)
if not out:
sys.exit(1)
কমান্ড-লাইন আউটপুট এখানে দেওয়া হয়েছে:
$ python test.py . -maxdepth 1 -name notthere
$ echo $?
1
$ find . -maxdepth 1 -name notthere
$ echo $?
0
$ find . -failedarg
find: unknown predicate `-failedarg'
$ echo $?
1
তারপরে, ফলাফলের জন্য যেখানে অনুসন্ধানে ত্রুটি ছিল তবে ফাইলগুলি পাওয়া গেছে:
$ ls -lh
$ d--------- 2 jeff users 6 Feb 6 11:49 noentry
$ find .
.
./noentry
find: `./noentry': Permission denied
$ echo $?
1
$ find . | egrep '.*'
.
./noentry
find: `./noentry': Permission denied
$ echo $?
0
python ../test.py
../test.py
$ echo $?
1
তারপরে, আপনি যদি ফাইলগুলির তালিকা চান তবে আপনি নালাগুলিতে -print 0
পাসের ব্যবহার করতে পারবেন find
এবং আউট ভেরিয়েবলটি বিভক্ত করতে পারবেন বা আপনি এর জন্য একটি মুদ্রণ বিবৃতি যুক্ত করতে পারেন।
এটা শুধুমাত্র হয় find
যে শূন্য হিসাবে ফেরৎ প্রস্থান স্থিতি কোডগুলি যখন এটি সফল হয়েছে। আপনি যে কমান্ডটি কার্যকর করেন তা ইউনিক্সে, যদি এটি সফল হয় তবে এটি প্রস্থান স্থিতিকে শূন্য হিসাবে ফিরিয়ে দেয়।
*
উপরegrep
Regex সম্পূর্ণরূপে অপ্রয়োজনীয়। যেহেতু আপনিegrep
নিয়মিত প্রকাশের বাক্য গঠন ব্যবহার করছেন না , তাই প্লেইন পুরাতনgrep
কয়েক মাইক্রোসেকেন্ড দ্রুত হতে পারে।