যখন কোনও মিল খুঁজে পাওয়া যায় না এমন ফাইলগুলি পাওয়া যায় না তখন আমি কি non ফাইন্ড `নন-0 ফিরে আসতে পারি?


46

এমনকি যখন /tmpকোনও ফাইল কল করা হয়নি something, এটির সাথে অনুসন্ধান findকরলে ফিরে আসবে 0:

  $ find /tmp -name something 
  $ echo $?
  0

যখন findকিছু না পাওয়া যায় তখন আমি কীভাবে নন-শূন্য প্রস্থান স্থিতি পেতে পারি?

উত্তর:


44

এখানে একটি ওয়ান-লাইনার যা আমি বিশ্বাস করি যা আপনি চান তা করে:

find /tmp -name something | egrep '.*'

0কোনও কিছুর সন্ধান পেলে প্রত্যাবর্তন স্থিতি হবে এবং অন্যথায় শূন্য নয়।

যদি আপনাকে findআরও প্রক্রিয়াজাতকরণের আউটপুট ক্যাপচার করতে হয় তবে সোভেনের উত্তরটি এটি কভার করেছে।


14
চিহ্ন *উপর egrepRegex সম্পূর্ণরূপে অপ্রয়োজনীয়। যেহেতু আপনি egrepনিয়মিত প্রকাশের বাক্য গঠন ব্যবহার করছেন না , তাই প্লেইন পুরাতন grepকয়েক মাইক্রোসেকেন্ড দ্রুত হতে পারে।
ট্রিপলি

আমি ব্যবহার করতে শিখেছিfind ... | read
স্যাম

14

সহজ সমাধান যা মুদ্রণ করে না, তবে ফলাফলগুলি পাওয়া গেলে 0 থেকে প্রস্থান করে

find /tmp -name something | grep -q "."

2
ডাবল-কোট এখানে কোনও উদ্দেশ্য করে না।
হরিদসভ

যদিও ডাবল উদ্ধৃতিগুলি কোনও কোড ফাংশন দেয় না, তারা এটি পাঠকের কাছে আরও স্পষ্ট করে তোলে যে পিরিয়ড অক্ষর একটি রেজেক্স নয় ডিরেক্টরি নয়।
ধর্ম বেল্লামকোন্ডা

13

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

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

2
আমি যতদূর বলতে পারি, এটি কাজ করে না। এর প্রস্থান কোডটি দৌড়ে যে findকোনও -execপ্রকারের প্রস্থান কোডের উপর নির্ভর করে বলে মনে হচ্ছে না ।
ক্রিস

@ ক্রিস আমার পক্ষে কাজ করে, এবং 4 জন যারা উন্নীত হয়েছিল
স্টিভেন পেনি

এই সমাধানের ভুলভাবে মিথ্যা ফলাফলের উদাহরণ: সন্ধান / বিদ্যমান-সূচনা-পয়েন্ট / অ-বিদ্যমান-সূচনা-পয়েন্ট-নাম ফাইল-ইন-বিদ্যমান-প্রারম্ভিক-পয়েন্ট-এক্সেক মিথ্যা {} +
জেরাল্ড স্ক্যাড

2
এটি সঠিকভাবে কাজ করে এবং ডকুমেন্টেড হয় (যদিও execবিভাগে লুকানো রয়েছে , ফেরতের মূল্যের নিচে নয়)। এটি খুঁজে পাওয়া কোনও কিছুর মধ্যে পার্থক্য করতে পারে না এবং নিজেকে ত্রুটিযুক্ত খুঁজে বের করতে পারে (যেমন যখন এটি অস্তিত্বহীন প্রারম্ভিক বিন্দুতে আহ্বান করা হয়েছিল)।
Tgr

আপনার যদি এই কার্যকারিতাটির প্রয়োজন হয় - হ্যাঁ
জেরাল্ড স্ক্যাড

7

পুতুলের সাথে সমস্যা সমাধানের জন্য আমার উপায় সন্ধান করার সময় এই প্রশ্নটি সন্ধান করার পরেও (ডিরেক্টরিতে কোনও ফোল্ডারে ডিরেক্টরিতে অনুমতি পরিবর্তিত হয় না) এটি কাজ করে বলে মনে হয়:

! test -z $(find /tmp -name something)

আমার নির্দিষ্ট ব্যবহারের ক্ষেত্রে এটি:

! test -z $(find /home -mindepth 1 -maxdepth 1 -perm -711)

কোন কোড 1 থেকে প্রস্থান করবে যদি ফাইন্ড কমান্ড প্রয়োজনীয় অনুমতিযুক্ত কোনও ফাইল না খুঁজে দেয়।


কয়েকটি সমাধান (এগুলি সব চেষ্টা করে দেখেনি) এখানে কোনও ম্যাকের কাজ হয়নি; এই করেছে।
অ্যালেক্স হল

5

এটা সম্ভব না. সাফল্যের সাথে প্রস্থান করলে 0 টি রিটার্ন সন্ধান করুন, এমনকি যদি এটি কোনও ফাইল না খুঁজে পায় (যা ফাইলের প্রকৃতপক্ষে উপস্থিত না থাকে তবে ত্রুটি নির্দেশ করে না এমন একটি সঠিক ফলাফল )।

ম্যানপেজটি অনুসন্ধান করুন

স্ট্যাটাস থেকে প্রস্থান করুন

স্থিতি 0 সহ প্রস্থানগুলি সন্ধান করুন যদি সমস্ত ফাইল সফলভাবে প্রক্রিয়া করা হয় তবে ত্রুটি দেখা দিলে 0 এর চেয়ে বড়। এটি ইচ্ছাকৃতভাবে একটি বিস্তৃত বিবরণ, তবে যদি ফেরতের মান শূন্য হয় না, তবে আপনাকে ফলাফলের সঠিকতার উপর নির্ভর করতে হবে না।

আপনি কী অর্জন করতে চান তার উপর নির্ভর করে আপনি -printফাইলের নাম খুঁজে পেতে এবং এর আউটপুটটির বিরুদ্ধে পরীক্ষা করার চেষ্টা করতে পারেন :

#!/bin/bash
MYVAR=`find . -name "something" -print`
if [ -z "$MYVAR" ]; then
    echo "Notfound"
else
   echo $MYVAR
fi

এটি অবশ্যই সম্ভব , যদিও যতটা শক্তিশালী তা কেউ চায় না।
Ruslan

ম্যানুয়াল পৃষ্ঠাটি দুর্বলভাবে সংগঠিত; রুসলান যা বলেছিল তা exec/ execdirঅপশনের অধীনে নথিভুক্ত করা হয়েছে (এর সাথে ব্যবহৃত +):If any invocation returns a non-zero value as exit status, then find returns a non-zero exit status.
টিজিআর

1

আমি অনুভব করি যে এটি সবচেয়ে সংক্ষিপ্ত এবং প্রত্যক্ষ পদ্ধতি:

test `find /tmp/ -name something -print -quit 2>/dev/null`

2
এই ক্ষেত্রে, যদি কোনও ত্রুটি থেকে থাকে তবে এটি ফলাফলটি / dev / null এ মুদ্রণ করবে, একটি শূন্য-বহির্গমন প্রস্থান করবে এবং তারপরে পরীক্ষার কমান্ড দ্বারা 0-এ স্থির হবে।
জেফ ফেরল্যান্ড

আমি বিশ্বাস করি না যে সত্য। আপনার উদাহরণ বর্ণনা করুন। যদি কোনও ত্রুটি হয় এবং প্রস্থানটি খুঁজে পায় তবে স্ট্রিংটি খালি থাকবে এবং পরীক্ষাটি শূন্য-শূন্যে ফিরে আসবে।
ড্যানরটন

আমি নিশ্চিত না যে আপনার উদাহরণটি কী হতে পারে তবে আমি দুর্ঘটনাক্রমে বাদ পড়েছি -print -quitযা আপনার উদ্বেগের সমাধান করতে পারে।
ড্যানরটন

সম্ভবত অন্য ব্যক্তি যাকে ডাউনওয়েট করেছেন (সম্ভবত একই কারণে) বিপরীত উদাহরণ প্রদান করতে পারেন?
ড্যানরটন

1
ঠিক আছে, আপনি আমার শৈলী পছন্দ করেন না। আমার ব্যবহারের ক্ষেত্রে, যে কোনও ত্রুটি রিপোর্ট হতে পারে সেগুলি শব্দ বা এত মারাত্মক যে তারা অন্য কোথাও প্রদর্শিত হবে। যাইহোক, এই পদ্ধতিটি চূড়ান্ত প্রশ্নের সঠিকভাবে উত্তর দেয়: "প্রদত্ত নামের দ্বারা পথে কোনও অ্যাক্সেসযোগ্য ফাইল রয়েছে?" একটি ত্রুটি "না" এর সঠিক উত্তর প্রদান করবে। আমি যদি তা না জানতে চাই তবে আমি আরও জটিল কোড যুক্ত করতে পারি যা এখানে উত্তর দেওয়া হয়নি এমন প্রশ্নের উত্তর দেয়।
ড্যানরটন

0

এখানে আমি কল একটি ছোট স্ক্রিপ্ট 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এবং আউট ভেরিয়েবলটি বিভক্ত করতে পারবেন বা আপনি এর জন্য একটি মুদ্রণ বিবৃতি যুক্ত করতে পারেন।


-1

এটা শুধুমাত্র হয় findযে শূন্য হিসাবে ফেরৎ প্রস্থান স্থিতি কোডগুলি যখন এটি সফল হয়েছে। আপনি যে কমান্ডটি কার্যকর করেন তা ইউনিক্সে, যদি এটি সফল হয় তবে এটি প্রস্থান স্থিতিকে শূন্য হিসাবে ফিরিয়ে দেয়।

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