मैं "खोज" से सभी "अनुमति अस्वीकृत" संदेशों को कैसे निकाल सकता हूं?


794

मुझे सभी अस्वीकृत संदेशों को छिपाने की आवश्यकता है :

find . > files_and_folders

इस तरह का संदेश आने पर मैं प्रयोग कर रहा हूं। मुझे सभी फ़ोल्डर्स और फ़ाइलों को इकट्ठा करने की आवश्यकता है, जिनके लिए यह उत्पन्न नहीं होता है।

क्या files_and_foldersफ़ाइल के लिए अनुमति स्तरों को निर्देशित करना संभव है ?

मैं एक ही समय में त्रुटियों को कैसे छिपा सकता हूं?

जवाबों:


259

नोट:
* यह उत्तर संभवतः उपयोग के मामले के वारंट की तुलना में अधिक गहरा है, और find 2>/dev/nullकई स्थितियों में पर्याप्त हो सकता है। यह अभी भी एक क्रॉस-प्लेटफ़ॉर्म परिप्रेक्ष्य के लिए और कुछ उन्नत शेल तकनीकों की चर्चा के लिए एक समाधान खोजने के हित में हो सकता है जो यथासंभव मजबूत है, भले ही इसके खिलाफ लगाए गए मामले काफी हद तक काल्पनिक हो सकते हैं।
* यदि आपका सिस्टम स्थानीयकृत त्रुटि संदेशों को दिखाने के लिए कॉन्फ़िगर किया गया है , तो यह सुनिश्चित करने के लिए findनीचे LC_ALL=C( LC_ALL=C find ...) के साथ कॉल उपसर्ग करें ताकि यह सुनिश्चित हो सके कि अंग्रेजी संदेश रिपोर्ट किए गए हैं grep -v 'Permission denied'। सदा ही, हालांकि, किसी भी त्रुटि संदेश है कि है प्रदर्शित हो तो अंग्रेजी में रूप में अच्छी तरह हो जाएगा।

यदि आपका शेल bashया हैzsh , तो एक ऐसा समाधान है जो केवल POSIX- अनुरूप findसुविधाओं का उपयोग करते हुए यथोचित सरल होने के साथ मजबूत है ; जबकि bashखुद पॉसिक्स का हिस्सा नहीं है, अधिकांश आधुनिक यूनिक्स प्लेटफार्म इसके साथ आते हैं, जिससे यह समाधान व्यापक रूप से पोर्टेबल हो जाता है:

find . > files_and_folders 2> >(grep -v 'Permission denied' >&2)

नोट: एक छोटा सा मौका है कि कुछ grepआउटपुट पूर्ण होने के बाद आ सकते हैं find, क्योंकि समग्र कमांड >(...)समाप्त होने के लिए कमांड के अंदर इंतजार नहीं करता है । इसमें bash, आप | catकमांड में जोड़कर इसे रोक सकते हैं ।

  • >(...)एक (शायद ही कभी इस्तेमाल) है उत्पादन प्रक्रिया प्रतिस्थापन उत्पादन पुनः निर्देशित करने की अनुमति देता है कि (इस मामले में, stderr निर्गम ( 2>) कमांड के अंदर की stdin के लिए >(...)
    के अलावा bashऔर zsh, kshका समर्थन करता है उन्हें रूप में अच्छी तरह सिद्धांत रूप में , लेकिन से पुनर्निर्देशन के साथ उन्हें गठबंधन करने के लिए कोशिश कर रहा है stderr , जैसा कि यहां किया गया है ( 2> >(...)), चुपचाप नजरअंदाज किया गया (में ksh 93u+) प्रतीत होता है ।

    • grep -v 'Permission denied'फिल्टर बाहर ( -v) (से सभी लाइनों findआदेश के stderr स्ट्रीम) कि वाक्यांश वाले Permission deniedऔर stderr करने के लिए शेष लाइनों आउटपुट ( >&2)।

यह दृष्टिकोण है:

  • मजबूत : grepकेवल त्रुटि संदेशों पर लागू होता है (और फ़ाइल पथों और त्रुटि संदेशों के संयोजन के लिए नहीं, संभवत: झूठी सकारात्मकता की ओर अग्रसर होता है), और अनुमति से वंचित लोगों के अलावा त्रुटि संदेश, stderr के माध्यम से पारित किए जाते हैं।

  • साइड-इफ़ेक्ट फ्री : findका एक्ज़िट कोड संरक्षित है: कम से कम एक फाइल सिस्टम आइटम तक पहुँचने में असमर्थता का परिणाम एग्ज़िट कोड में मिलता है 1(हालाँकि यह आपको नहीं बताएगा कि अनुमति-अस्वीकृत लोगों के अलावा अन्य त्रुटियां हुईं (भी))।


POSIX- संगत समाधान:

पूरी तरह से POSIX- अनुरूप समाधानों में या तो सीमाएं हैं या अतिरिक्त कार्य की आवश्यकता है।

यदि findकिसी भी तरह से आउटपुट को फाइल में कैद किया जाना है (या पूरी तरह से दबा दिया गया है), तो जोनाथन लेफ़लर के उत्तर से पाइपलाइन आधारित समाधान सरल, मजबूत और पॉसिक्स-अनुरूप है:

find . 2>&1 >files_and_folders | grep -v 'Permission denied' >&2

ध्यान दें कि पुनर्निर्देश का क्रम मायने रखता है: पहले2>&1 आना चाहिए ।

एक फाइल अप फ्रंट में स्टडआउट आउटपुट को कैप्चर 2>&1करने से पाइप लाइन के माध्यम से केवल त्रुटि संदेश भेजने की अनुमति मिलती है , जो grepतब असंबद्ध रूप से काम कर सकता है।

केवल नकारात्मक पक्ष यह है कि समग्र बाहर निकलें कोड हो जाएगा grepआदेश के , नहीं findकरता है, तो देखते हैं: की, जो इस मामले में अर्थ है कोई सब या कम से त्रुटियों केवल अनुमति से इनकार त्रुटियों, बाहर निकलें कोड दिया जाएगा 1(संकेत विफलता ), अन्यथा ( अनुमति-अस्वीकृत लोगों के अलावा अन्य त्रुटियां) 0- जो इरादे के विपरीत है।
उस ने कहा, find'एग्जिट कोड' का इस्तेमाल वैसे भी कम ही किया जाता है , क्योंकि यह अक्सर गैर-मौजूद रास्ते से गुजरने जैसी मूलभूत विफलता से परे बहुत कम जानकारी देता है ।
हालाँकि, केवल कुछ का विशिष्ट मामलाइनपुट पथ अनुमतियों की कमी के कारण दुर्गम होने का है में परिलक्षित होता findहै बाहर निकलने के कोड (दोनों जीएनयू और बीएसडी में find): एक अनुमति-से इनकार त्रुटि तब होती है, तो के लिए किसी भी कार्रवाई की फाइलों की, बाहर निकलें कोड के लिए निर्धारित है 1

निम्नलिखित भिन्नताएं संबोधित करती हैं कि:

find . 2>&1 >files_and_folders | { grep -v 'Permission denied' >&2; [ $? -eq 1 ]; }

अब, निकास कोड इंगित करता है कि क्या हुई के अलावा कोई त्रुटि है Permission denied: 1यदि हां, तो 0अन्यथा।
दूसरे शब्दों में: अब बाहर निकलने का कोड कमांड के असली इरादे को दर्शाता है: सफलता ( 0) की सूचना दी गई है, यदि कोई त्रुटि नहीं है या केवल अनुमति-अस्वीकृत त्रुटियां हुई हैं।
यह findशीर्ष पर समाधान के रूप में, केवल पासिंग एक्जिट कोड से गुजरने से बेहतर है ।


टिप्पणी में gniourf_gniourf ने परिष्कृत पुनर्निर्देशन का उपयोग करके इस समाधान के एक (अभी भी POSIX- अनुरूप) सामान्यीकरण का प्रस्ताव किया है , जो फ़ाइल पथों को stdout में प्रिंट करने के डिफ़ॉल्ट व्यवहार के साथ भी काम करता है :

{ find . 3>&2 2>&1 1>&3 | grep -v 'Permission denied' >&3; } 3>&2 2>&1

संक्षेप में: कस्टम फ़ाइल डिस्क्रिप्टर 3का उपयोग अस्थायी रूप से stdout ( 1) और Stderr ( 2) को स्वैप करने के लिए किया जाता है , ताकि अकेले त्रुटि संदेशों grepको stdout के माध्यम से पाइप किया जा सके ।

इन पुनर्निर्देशनों के बिना, डेटा (फ़ाइल पथ) और त्रुटि संदेश दोनों grepको stdout के माध्यम से पाइप किया grepजाएगा , और फिर त्रुटि संदेश Permission denied और (काल्पनिक) फ़ाइल के बीच अंतर करने में सक्षम नहीं होगा जिसका नाम वाक्यांश को समाहित करने के लिए होता हैPermission denied

पहले समाधान के रूप में, हालांकि, बाहर निकलने का कोड grep's नहीं find, बल्कि रिपोर्ट किया जाएगा , लेकिन इसके बाद के संस्करण के समान ही लागू किया जा सकता है।


मौजूदा उत्तरों पर नोट:

  • वहाँ कई बिंदुओं के बारे में नोट करने के लिए कर रहे हैं माइकल Brux के जवाब , find . ! -readable -prune -o -print:

    • इसके लिए जीएनयू की आवश्यकता है find; विशेष रूप से, यह macOS पर काम नहीं करेगा। बेशक, अगर आपको केवल GNU के साथ काम करने के लिए कमांड की आवश्यकता है find, तो यह आपके लिए कोई समस्या नहीं होगी।

    • कुछ Permission deniedत्रुटियां अभी भी सतह पर हो सकती हैं : निर्देशिकाओं find ! -readable -pruneकी बाल वस्तुओं के लिए ऐसी त्रुटियां रिपोर्ट करती हैं जिनके लिए वर्तमान उपयोगकर्ता की rअनुमति है, लेकिन कमी x(निष्पादन योग्य) अनुमति नहीं है। कारण यह है कि क्योंकि निर्देशिका ही है है पठनीय, -pruneनिष्पादित नहीं है, और उतरना करने के प्रयास में है कि निर्देशिका तो त्रुटि संदेश से चलाता है। उस ने कहा, ठेठ मामला rलापता होने की अनुमति के लिए है।

    • नोट: निम्नलिखित बिंदु दर्शन और / या विशिष्ट उपयोग के मामले की बात है, और आप यह तय कर सकते हैं कि यह आपके लिए प्रासंगिक नहीं है और यह कि कमांड आपकी आवश्यकताओं को अच्छी तरह से फिट बैठता है, खासकर यदि केवल रास्तों को प्रिंट करने के लिए आप सब करते हैं:

      • यदि आप अनुमति-अस्वीकृत त्रुटि संदेशों के फ़िल्टरिंग को एक अलग कार्य मानते हैं, जिसे आप किसी भी find कमांड पर लागू करने में सक्षम होना चाहते हैं , तो अनुमति-अस्वीकृत त्रुटियों को रोकने के विपरीत दृष्टिकोण को findकमांड में "शोर" शुरू करने की आवश्यकता होती है , जो यह भी बताता है जटिलता और तार्किक नुकसान
      • उदाहरण के लिए, माइकल के जवाब (इस लेखन के अनुसार) पर सबसे अधिक मतदान वाली टिप्पणी यह ​​दिखाने का प्रयास करती है कि एक फिल्टर सहित कमांड को कैसे बढ़ाया जाए-name , इस प्रकार है:
        find . ! -readable -prune -o -name '*.txt'
        यह, हालांकि, इरादा के अनुसार काम नहीं करता है , क्योंकि अनुगामी -printकार्रवाई की आवश्यकता होती है ( इस उत्तर में एक स्पष्टीकरण पाया जा सकता है )। इस तरह की सूक्ष्मता बग का परिचय दे सकती है।
  • में पहली समाधान जोनाथन Leffler की जवाब , find . 2>/dev/null > files_and_folders, के रूप में वह खुद को कहा गया है, आँख बंद करके चुप्पी सभी त्रुटि संदेश (और वैकल्पिक हल, बोझिल और पूरी तरह से मजबूत नहीं है के रूप में वह यह भी बताते हैं)। व्यावहारिक रूप से बोलना , हालांकि, यह सबसे सरल समाधान है , क्योंकि आप यह मान सकते हैं कि कोई भी और सभी त्रुटियां अनुमति से संबंधित होंगी।

  • धुंध का जवाब , sudo find . > files_and_folders, संक्षिप्त और व्यावहारिक, लेकिन केवल के अलावा और कुछ के लिए बीमार की सलाह दी है मुद्रण फ़ाइल नाम , सुरक्षा कारणों से: क्योंकि आप के रूप में चला रहे हैं जड़ उपयोगकर्ता, "यदि आप अपने पूरे सिस्टम होने खोजने में एक बग द्वारा गड़बड़ जा रहा जोखिम या एक दुर्भावनापूर्ण संस्करण, या एक गलत आह्वान जो अप्रत्याशित रूप से कुछ लिखता है, जो सामान्य विशेषाधिकार के साथ ऐसा करने पर नहीं हो सकता है "( ट्रिपलआई द्वारा धुंध के जवाब पर एक टिप्पणी से )।

  • Viraptor के उत्तर में दूसरा समाधान , find . 2>&1 | grep -v 'Permission denied' > some_fileझूठी सकारात्मकता का जोखिम चलाता है (पाइपलाइन के माध्यम से stdout और stderr का मिश्रण भेजने के कारण), और, संभवतः, stderr के माध्यम से गैर- प्रवेश-अस्वीकार त्रुटियों की रिपोर्ट करने के बजाय , उन्हें आउटपुट पथ के साथ कैप्चर करता है आउटपुट फ़ाइल में।


4
बस एक त्वरित प्रश्न: आप एक प्रक्रिया प्रतिस्थापन का उपयोग क्यों करते हैं और न केवल एक पाइप find . 2>&1 > files_and_folders | grep -v 'Permission denied' >&2:?
gnourf_gniourf 20

2
@ LéoLéopoldHertz é: यदि आप किसी बाहरी फ़ाइल पर आउटपुट नहीं देना चाहते हैं, तो बस अधिक प्लंबिंग करें:{ find . 3>&2 2>&1 1>&3 | grep -v 'Permission denied' >&3; } 3>&2 2>&1
gniourf_gniourf

2
@ LéoLéopoldHertz é: बस यह POSIX आज्ञाकारी है। प्रक्रिया प्रतिस्थापन >(...)बैश-विशिष्ट हैं।
gniourf_gniourf

2
मुझे यकीन नहीं है कि बाहर निकलने के कोड के संरक्षण findपर जोर दिया जाना चाहिए और विज्ञापित किया जाना चाहिए: findबाहर निकलने का कोड कुख्यात है। यहाँ, यह बहुत संभव है कि गैर-शून्य हो (और बेकार में)।
ग्नौरफ_ग्निऑरफ

3
POSIX स्पष्ट रूप से execute/searchएक निर्देशिका 'खोज' के लिए फ़ाइल-मोड अनुमति की आवश्यकता होती है (निहित फ़ाइलों के आयतों को पुनः प्राप्त)। findयह एक उपनिर्देशिका ( readएक निर्देशिका में फ़ाइलों को सूचीबद्ध करने के लिए अनुमति की आवश्यकता के अलावा) में उतरने के लिए करता है । यह 'बग' या 'पोर्टिंग एरर' नहीं है।
वेजर्डन

542

उपयोग:

find . 2>/dev/null > files_and_folders

यह न केवल Permission deniedत्रुटियों को छुपाता है , निश्चित रूप से, लेकिन सभी त्रुटि संदेश।

यदि आप वास्तव में अन्य संभावित त्रुटियों को रखना चाहते हैं, जैसे कि एक सिमलिंक पर बहुत सारे हॉप्स, लेकिन अनुमति से इनकार नहीं करते हैं, तो आपको शायद एक उड़ान का अनुमान लगाना होगा कि आपके पास 'अनुमति अस्वीकृत' नामक कई फाइलें नहीं हैं। और कोशिश:

find . 2>&1 | grep -v 'Permission denied' > files_and_folders

यदि आप सख्ती से सिर्फ मानक त्रुटि को फ़िल्टर करना चाहते हैं, तो आप अधिक विस्तृत निर्माण का उपयोग कर सकते हैं:

find . 2>&1 > files_and_folders | grep -v 'Permission denied' >&2

मैं / पुनर्निर्देशन पर हे findआदेश है: 2>&1 > files_and_folders |। पाइप मानक आउटपुट को grepकमांड पर पुनर्निर्देशित करता है और पहले लागू किया जाता है। 2>&1मानक आउटपुट (पाइप) के रूप में ही जगह पर मानक त्रुटि भेजता है। > files_and_foldersएक फाइल करने के लिए मानक आउटपुट (लेकिन मानक नहीं त्रुटि) भेजता है। शुद्ध परिणाम यह है कि मानक त्रुटि के लिए लिखे गए संदेश पाइप के नीचे भेजे जाते हैं और findफ़ाइल को नियमित आउटपुट लिखा जाता है। grepफिल्टर मानक निर्गम (आप तय कर सकते हैं कि चयनात्मक आप इसे होना चाहते हैं, और स्थान और हे / एस के आधार पर वर्तनी को बदलने के लिए हो सकता है) और अंतिम>&2इसका मतलब है कि बचे हुए त्रुटि संदेश (मानक आउटपुट के लिए लिखे गए) एक बार फिर मानक त्रुटि पर जाते हैं। अंतिम पुनर्निर्देशन को टर्मिनल पर वैकल्पिक माना जा सकता है, लेकिन इसे स्क्रिप्ट में उपयोग करने के लिए एक बहुत अच्छा विचार होगा ताकि मानक त्रुटि पर त्रुटि संदेश दिखाई दें।

इस विषय पर अंतहीन विविधताएं हैं, जो आप करना चाहते हैं उसके आधार पर। यह यूनिक्स के किसी भी संस्करण पर किसी भी बॉर्न शेल व्युत्पन्न (बैश, कॉर्न, ...) और किसी भी पोसिक्स-अनुरूप संस्करण के साथ काम करेगा find

यदि आप findअपने सिस्टम के विशिष्ट संस्करण के अनुकूल होना चाहते हैं, तो वैकल्पिक विकल्प उपलब्ध हो सकते हैं। findविशेष रूप से GNU के पास अन्य संस्करणों में असंख्य विकल्प उपलब्ध नहीं हैं - विकल्पों में से एक के लिए वर्तमान में स्वीकृत उत्तर देखें।


9
यदि आप मेरी तरह हैं, तो ध्यान दें कि जगह की कमी महत्वपूर्ण है! 2>/dev/null, बिना स्थान के!
निक

20
2>किसी स्पेस के एक एकल इकाई है, आपके पास इसके और फ़ाइल नाम के बीच एक स्थान हो सकता है। इसी तरह अन्य पुनर्निर्देशन के साथ, जैसे कि 2>&1(जो मानक आउटपुट के समान मानक त्रुटि को उसी स्थान पर पुनर्निर्देशित करता है), या 2>&-जो मानक त्रुटि को बंद करता है, आदि शेष शेष विवरण के लिए पुनर्निर्देशन देखें। (ऊपर दिया गया कोड सामान्य POSIX- जैसा शेल है, जो विशिष्ट नहीं है bash।)
जोनाथन लेफ़लर

3
मुझे एक पूंजी P का उपयोग करना था क्योंकि यही मेरा टर्मिनल आउटपुट होगा: खोज। 2> और 1 | grep -v 'अनुमति अस्वीकृत'
डेविड डोरिया

4
यह एक स्वीकार्य समाधान कैसे है? 1) आप सभी त्रुटियों को देव / अशक्त 2 पर पुनर्निर्देशित कर रहे हैं) आप एक स्पष्ट त्रुटि स्ट्रिंग फ़िल्टर कर रहे हैं !! इन के आधार पर प्रसिद्ध भंगुर है और अगर आपकी फ़ाइल 'अनुमति अस्वीकृत' नाम की निर्देशिका में थी, तो क्या होगा? ऊप्स!
गनचर्स 6

10
मैं प्रोग्राम के आउटपुट को संशोधित करने के लिए त्रुटि स्ट्रिंग के खिलाफ आपत्ति कर रहा हूं। यह ज्यादातर समय काम करेगा, लेकिन सरल सही समाधान नहीं है (नीचे परमिट के साथ खोजें)। आपको एक उदाहरण देने के लिए क्यों, यह OSX पर काम नहीं करेगा क्योंकि त्रुटि "अनुमति अस्वीकृत" है। किसी भी अन्य प्रणाली के लिए भी जहां त्रुटि स्ट्रिंग में भी मामूली अंतर है (किसी का भी अंतर्राष्ट्रीयकरण?)
15

285

उपयोग:

find . ! -readable -prune -o -print

या अधिक आम तौर पर

find <paths> ! -readable -prune -o <other conditions like -name> -print
  • से बचने के लिए "अनुमति से इनकार"
  • और (अन्य) त्रुटि संदेशों को दबाएं नहीं
  • और बाहर निकलने की स्थिति प्राप्त करें 0 ("सभी फाइलें सफलतापूर्वक संसाधित होती हैं")

के साथ काम करता है: खोज (GNU खोजक) 4.4.2। पृष्ठभूमि:

  • -readableपरीक्षण पठनीय फ़ाइलों मेल खाता है। !ऑपरेटर सच देता है, जब परीक्षण गलत है। और ! -readableपठनीय निर्देशिकाओं (और फ़ाइलों) से मेल नहीं खाता।
  • -pruneकार्रवाई निर्देशिका में उतर नहीं करता है।
  • ! -readable -prune इसका अनुवाद किया जा सकता है: यदि निर्देशिका पठनीय नहीं है, तो उसमें न उतरें।
  • -readableपरीक्षण खाते अभिगम नियंत्रण सूची और अन्य अनुमतियाँ कलाकृतियों जो में ले जाता है -permपरीक्षण ध्यान नहीं देता।

कई और विवरणों के लिए find(1) मैनपेज भी देखें ।


6
मतभेद पहले से ही उल्लेख किया गया है। यदि आपको समझ में नहीं आता है, तो उत्तर शायद आपके लिए कोई फर्क नहीं करते हैं? STDOUT एक ही है - STDERR अलग है (आपको इस उत्तर के साथ अन्य त्रुटि संदेश मिलते हैं) - $? इस जवाब के साथ अलग है (0 "सफल" है, जब कोई अन्य त्रुटि नहीं होती है - हमेशा> 0 "सफल नहीं होती है" जब देव / अशक्त पर पुनर्निर्देशित किया जाता है) - शायद किसी को "सही" $ की आवश्यकता है? एक स्क्रिप्ट में
माइकल ब्रूक्स

6
@ मासी सबसे स्पष्ट दोष है जोनाथन का जवाब (grep -v) फ़ाइल नाम को बाहर कर देगा जिसमें 'अनुमति से वंचित' शामिल हैं :)
फलों का

65
मुझे यह जोड़ना उचित लगता है कि यदि आपको कुछ अन्य खोज मापदंड जोड़ने की आवश्यकता है, तो यह किया जाना चाहिए -o:find . ! -readable -prune -o -name '*.txt'
tempestadept

22
ध्यान दें कि POSIX findमें -readableविकल्प के रूप में शामिल नहीं है; न तो findबीएसडी के लिए और इसलिए मैक ओएस एक्स (मैं अन्य प्रणालियों के बारे में निश्चित नहीं हूं)। इसलिए, जहां आपने GNU की findगारंटी दी है, यह बहुत अच्छा काम करता है, लेकिन यह स्पष्ट नहीं है कि इसे कैसे अनुकूलित किया जाए यदि आप गारंटी नहीं दे सकते कि सिस्टम ने GNU findस्थापित किया है। (यह लिनक्स पर ठीक काम करेगा; यह कहीं और भी काम कर सकता है या नहीं।)
जोनाथन लेफ़लर

6
find . ! -readable -prune -o -name '*.txt'खोजने के लिए Ubuntu 14.04 पर काम नहीं कर रहे हैं 4.2.2 खोजें। यह अंतर्ग्रहण लगता है -name। कुछ अजीब कारण से मुझे सफलता मिलीfind . \( ! -readable -prune \) -o -name '*.txt' -print
con-f-use

110

यदि आप रूट "/" से खोज शुरू करना चाहते हैं, तो आप शायद आउटपुट somethings देखेंगे:

find: /./proc/1731/fdinfo: Permission denied
find: /./proc/2032/task/2032/fd: Permission denied

यह अनुमति के कारण है। इसे हल करने के लिए:

  1. आप sudo कमांड का उपयोग कर सकते हैं:

    sudo find /. -name 'toBeSearched.file'

यह सुपर उपयोगकर्ता का पासवर्ड पूछता है, जब आप पासवर्ड दर्ज करते हैं तो आपको वही परिणाम दिखाई देगा जो आप वास्तव में चाहते हैं। यदि आपके पास sudo कमांड का उपयोग करने की अनुमति नहीं है, जिसका अर्थ है कि आपके पास सुपर उपयोगकर्ता का पासवर्ड नहीं है, तो पहले सिस्टम व्यवस्थापक से आपको sudoers फ़ाइल में जोड़ने के लिए कहें।

  1. आप कुछ फ़ाइल में मानक त्रुटि आउटपुट (आम तौर पर डिस्प्ले / स्क्रीन) से रीडायरेक्ट कर सकते हैं और स्क्रीन पर त्रुटि संदेशों को देखने से बच सकते हैं! एक विशेष फ़ाइल / dev / null पर पुनर्निर्देशित करें:

    find /. -name 'toBeSearched.file' 2>/dev/null
  2. आप मानक त्रुटि आउटपुट (आम तौर पर डिस्प्ले / स्क्रीन) से मानक आउटपुट (आम तौर पर डिस्प्ले / स्क्रीन) पर रीडायरेक्ट का उपयोग कर सकते हैं, फिर आउटपुट लाइनों को न देखने के लिए -v "इनवर्ट" पैरामीटर के साथ grep कमांड के साथ पाइप करें जिसे 'अनुमति अस्वीकृत' है शब्द जोड़े:

    find /. -name 'toBeSearched.file' 2>&1 | grep -v 'Permission denied'

7
@scottmrogowski को छोड़कर, यह सवाल का जवाब नहीं देता है ... 1. सिस्टम व्यवस्थापक से आपको sudoers फ़ाइल में जोड़ने के लिए कहें। 2.sudo find...
स्टीफन

1
ठीक वही जो मेरे द्वारा खोजा जा रहा था!
डंकमास्टरडान

92

मुझे उपयोग करना था:

find / -name expect 2>/dev/null

जो मैं खोजना चाहता था उसका नाम निर्दिष्ट करना और फिर इसे सभी त्रुटियों को / dev / null में पुनर्निर्देशित करना

मैं जिस उम्मीद कार्यक्रम के लिए खोज रहा था, उसका स्थान होने की उम्मीद है।


3
@ मासी, जवाब में आदेश का उपयोग नहीं करता है expect। इसके बजाय, expectबस उस फ़ाइल का नाम है जिसे यह कमांड खोजने की कोशिश करेगा।
ध्रुव कपूर

2
ब्लाइंडली सभी स्टैडर आउटपुट को केवल त्रुटि संदेशों के एक वर्ग को अनदेखा करने के लिए पुनर्निर्देशित करना आम तौर पर एक बुरा विचार है - आप प्रक्रिया में अन्य सभी मनमानी त्रुटियों को खो देंगे।
जोसिफ रोडिन

59

पाइप stderrके लिए /dev/nullका उपयोग करके 2> / dev / बातिल

find . -name '...' 2>/dev/null


2
मैक ओएसएक्स पर भी यह मेरे लिए ठीक काम करता है। या यहां तक ​​किfind . -name '...' -print 2>/dev/null
परछाई

30

आप अपठित निर्देशिकाओं में उतरने से बचने के लिए भी उपयोग कर सकते हैं -permऔर -pruneभविष्यवाणी कर सकते हैं (यह भी देखें कि मैं खोज कार्यक्रम से प्रिंटआउट स्टेटमेंट को "अनुमति से वंचित" अनुमति कैसे निकालूं? - यूनिक्स और लिनक्स स्टैक एक्सचेंज )

find . -type d ! -perm -g+r,u+r,o+r -prune -o -print > files_and_folders

4
-perm -g+r,u+r,o+rकेवल उन फ़ाइलों से मेल खाता है जिनके पास फ़ाइल के सुरक्षा प्रिंसिपल केr सभी 3 के लिए (पढ़ें) अनुमति सेट है , जिसका वर्तमान उपयोगकर्ता उस फ़ाइल को पढ़ सकता है या नहीं , इसके साथ कोई सीधा संबंध नहीं है। इसमें दोनों मिस फ़ाइलों की क्षमता है जो वर्तमान उपयोगकर्ता पढ़ सकते हैं और उन फ़ाइलों से मिलान कर सकते हैं जो वे नहीं कर सकते हैं।
mklement0

मुझे लगता find . -type d ! \( -perm -u+r -o -perm -g+r -o -perm -o+r \) -prune -o -printहै कि अच्छा समाधान होगा।
मटिया 72

2
@ Mattia72: नहीं, यह पूरी तरह से अनुकरण करने के लिए मौलिक रूप से असंभव है -readableके साथ -perm- मेरी पिछली टिप्पणी देख सकते हैं और इस उदाहरण पर विचार करें: echo 'hi' > file; sudo chown nobody:nobody file; sudo chmod o-r file; find file -perm -u=rप्रिंट file, क्योंकि इसके उपयोगकर्ता को पढ़ने बिट सेट कर दिया जाता है, लेकिन यह करने के लिए संबंधित nobodyउपयोगकर्ता, नहीं वर्तमान उपयोगकर्ता। वर्तमान उपयोगकर्ता इस फ़ाइल को नहीं पढ़ सकता है; कोशिश करो cat file। यह भी देखें: मेरा यह जवाब
mklement0

23

रीडायरेक्ट मानक त्रुटि। उदाहरण के लिए, यदि आप यूनिक्स मशीन पर बैश का उपयोग कर रहे हैं, तो आप मानक त्रुटि को / dev / null को इस तरह से रीडायरेक्ट कर सकते हैं:

find . 2>/dev/null >files_and_folders

20

जबकि उपरोक्त दृष्टिकोण मैक ओएस एक्स के लिए मामले को संबोधित नहीं करते हैं क्योंकि मैक ओएस एक्स -readableस्विच का समर्थन नहीं करता है इस तरह आप अपने आउटपुट में 'अनुमति से इनकार' त्रुटियों से बच सकते हैं। यह किसी की मदद कर सकता है।

find / -type f -name "your_pattern" 2>/dev/null

यदि आप किसी अन्य कमांड का उपयोग कर रहे हैं find, उदाहरण के लिए, किसी निर्देशिका में निश्चित पैटर्न की फ़ाइलों के आकार को खोजने के लिए 2>/dev/nullतब भी काम किया जाएगा जैसा कि नीचे दिखाया गया है।

find . -type f -name "your_pattern" -exec du -ch {} + 2>/dev/null | grep total$

यह किसी दिए गए पैटर्न की फ़ाइलों का कुल आकार लौटाएगा। नोट 2>/dev/nullकमांड के अंत में ध्यान दें ।


ओएस एक्स के लिए अच्छा बंधन! जोनाथन का जवाब हिस्सा बताता है 2>/dev/null। क्या आप कृपया हिस्सा बता सकते हैं -exec du -ch {} + 2>/dev/null | grep total$
लेओ लेपोल्ड हर्ट्ज़ '

1
@ मासी आप कमांड -execद्वारा मिली फाइलों या निर्देशिकाओं पर आगे की कार्रवाई करने के लिए विकल्प के साथ किसी भी कमांड का उपयोग कर सकते हैं finddu -ch file_patternप्रत्येक फ़ाइल से मेल खाते के आकार की गणना करता है file_patternऔर उस आउटपुट की अंतिम पंक्ति उन सभी फ़ाइलों का भव्य कुल है जो मेल खाती है file_pattern। के लिए मैन पेज देखें dugrep totalबस उस लाइन को फ़िल्टर करता है जो भव्य कुल को निकालता है (जो अंतिम पंक्ति है)।
Bunti

13

उन त्रुटियों को मानक त्रुटि आउटपुट (fd 2) के लिए प्रिंट किया जाता है। उन्हें फ़िल्टर करने के लिए, बस सभी त्रुटियों को / dev / null पर पुनर्निर्देशित करें:

find . 2>/dev/null > some_file

या पहले stderr और stdout को मिलाएं और फिर उन विशिष्ट त्रुटियों को टटोलें:

find . 2>&1 | grep -v 'Permission denied' > some_file

11

सरल उत्तर:

find . > files_and_folders 2>&-

2>&-बंद ( -) मानक त्रुटि फ़ाइल डिस्क्रिप्टर ( 2) इसलिए सभी त्रुटि संदेश खामोश हैं।

  • बाहर निकलें कोड अभी भी होगा 1अगर किसी भी ' Permission denied' त्रुटियों अन्यथा मुद्रित किया जाएगा

GNU के लिए मजबूत जवाब find:

find . -type d \! \( -readable -executable \) -prune -print -o -print > files_and_folders

करने के लिए अतिरिक्त विकल्प दर्रा findकि -prune(में उतरते रोकने), लेकिन अभी भी -printकिसी भी निर्देशिका ( ) कि (नहीं करता है ) दोनों है और अनुमतियाँ, या ( ) किसी भी अन्य फाइल।-typed\!-readable-executable-o-print

  • -readableऔर -executableविकल्प GNU एक्सटेंशन हैं, POSIX मानक का हिस्सा नहीं हैं
  • अभी भी Permission deniedअसामान्य / भ्रष्ट फाइलों पर ' ' लौट सकते हैं (उदाहरण के लिए, <v2.0.5 का उपयोग करके कंटेनर-माउंटेड फाइल सिस्टम को प्रभावित करने वाली बग रिपोर्ट देखें lxcfs)

मजबूत जवाब जो किसी भी POSIX- संगत find(GNU, OSX / BSD, आदि) के साथ काम करता है

{ LC_ALL=C find . 3>&2 2>&1 1>&3 > files_and_folders | grep -v 'Permission denied'; [ $? = 1 ]; } 3>&2 2>&1

स्ट्रिंग वाली सभी लाइनों को हटाने के लिए , मानक त्रुटि स्ट्रीम को पास करने के लिए एक पाइपलाइन का उपयोग करें ।grep'Permission denied'

LC_ALL=Cपर्यावरण चर का उपयोग करके POSIX लोकेल सेट करता है , और मानक-त्रुटि स्ट्रीम को पाइप करने के लिए डुप्लिकेट फ़ाइल डिस्क्रिप्टर को सेट करता है , और मूल व्यवहार को लगभग अनुमानित करने के लिए दिए गए त्रुटि कोड को पलटने के लिए उपयोग करता है ।3>&2 2>&1 1>&33>&2 2>&1 grep[ $? = 1 ][]grepfind

  • 'Permission denied'आउटपुट पुनर्निर्देशन के कारण किसी भी त्रुटि को भी फ़िल्टर करेगा (उदाहरण के लिए, यदि files_and_foldersफ़ाइल स्वयं लेखन योग्य नहीं है)

जॉर्डिफ़ेरन के उत्तर प्रस्ताव के बारे में आपका क्या विचार है? - - क्या आप अपने उत्तर की तुलना इससे कर सकते हैं?
लेओ लेपोल्ड हर्ट्ज़ '

2
जैसा कि कहा गया है कि उत्तर की शेल स्क्रिप्ट सामान्य-उद्देश्य नहीं है (केवल सूची निर्देशिका जो $ {m_find_name} से मेल खाती हैं)), और इसमें सवाल (अच्छा, / घर *, -maxdepth 5, -follow) से संबंधित कई विकल्प नहीं हैं। यह उत्तर सामान्य उद्देश्य से शेष रहते हुए, 'पढ़ने योग्य लेकिन निष्पादन योग्य निर्देशिकाओं को अधिक संक्षिप्त रूप से फ़िल्टर करने' के विशिष्ट मुद्दे को संबोधित करता है।
वेजर्डन

1
@wjordan: धन्यवाद। मैंने अपनी टिप्पणियों को हटा दिया है, लेकिन एक बिंदु अभी भी लागू होता है: -perm-बेड समाधान प्रस्तुत करने के लायक नहीं है, क्योंकि यह मूल रूप से बोली से अधिक मौलिक रूप से सुझाए गए से कुछ अलग करता है : यह फ़ाइल के मालिक से संबंधित विशुद्ध रूप से फ़ाइल-केंद्रित परीक्षण है और समूह, जिनमें से किसी के भी कमांड कॉल करने वाले उपयोगकर्ता के साथ कोई गारंटीकृत संबंध नहीं है ( मेरा यह उत्तर देखें) । यह आपके संशोधित जीएनयू समाधान जैसा दिखता है अब फाइलों से उपजी त्रुटियों से इनकार करने की अनुमति नहीं देता है ।
mklement0

मैं आपके द्वारा उपयोग किए जा रहे वाक्यविन्यास (न तो GNU के रूप में और न ही BSD के रूप में) को पहचानता हूं, लेकिन मुझे अपनी बात स्व-निहित उदाहरण के साथ स्पष्ट करने दें: echo 'hi' > file; sudo chown nobody:nobody file; sudo chmod o-r file; find file -perm -u=rप्रिंट file, क्योंकि इसका उपयोगकर्ता पढ़ा गया बिट सेट है, लेकिन यह nobodyउपयोगकर्ता से संबंधित है , वर्तमान उपयोगकर्ता नहीं। वर्तमान उपयोगकर्ता इस फ़ाइल को नहीं पढ़ सकता है; कोशिश करो cat file
mklement0

1
@ mklement0 चर्चा के लिए धन्यवाद, मैं आपके द्वारा किसी अन्य परीक्षण में वर्णित व्यवहार का उत्पादन करने में कामयाब रहा (पता नहीं कि मैंने पहली बार क्या गलत किया था), ऐसा लगता है कि -permउपयोगकर्ता की वर्तमान अनुमतियों को निर्धारित करने के लिए काम नहीं करता है। इस जवाब से उस विकल्प को हटा दिया।
वेजर्डन

4

केवल अनुमति से इनकार करने की चेतावनी से बचने के लिए , बताएं कि अप्राप्य फ़ाइलों को खोज से हटाकर अनदेखा करें। अपनी खोज में OR के रूप में एक अभिव्यक्ति जोड़ें, जैसे कि

find / \! -readable -prune -o -name '*.jbd' -ls

यह ज्यादातर (एक अपठनीय फ़ाइल से मेल खाता है और सूची से इसे prune करता है) या ( * .jbd जैसे एक नाम से मेल खाता है और इसे प्रदर्शित करता है [ls के साथ]) । (याद रखें कि डिफ़ॉल्ट रूप से भाव एक साथ होते हैं और जब तक आप उपयोग नहीं करते हैं, तब तक-) आपको दूसरी अभिव्यक्ति में -ls की आवश्यकता होती है या फिर मिलान को दिखाने के लिए डिफ़ॉल्ट क्रिया जोड़ सकते हैं, जो आपको सभी अपठनीय फ़ाइलों को भी दिखाएगा ।

लेकिन अगर आप अपने सिस्टम पर वास्तविक फ़ाइलों की तलाश कर रहे हैं, तो आमतौर पर / dev में देखने का कोई कारण नहीं है, जिसमें कई फाइलें हैं, इसलिए आपको एक अभिव्यक्ति जोड़ना चाहिए जो उस निर्देशिका को बाहर करती है, जैसे:

find / -mount \! -readable -prune  -o  -path /dev -prune  -o  -name '*.jbd' -ls

तो (सूची से अपठनीय फ़ाइल और prune मिलान ) या (मिलान सूची / सूची से देव और prune) या ( * .jbd की तरह मिलान फ़ाइल और इसे प्रदर्शित करें)


4

उपयोग

sudo find / -name file.txt

यह बेवकूफी है (क्योंकि आप खोज को बढ़ाते हैं) और बकवास करते हैं, लेकिन लिखने के लिए बहुत कम।


आप यहाँ पूरे फाइल सिस्टम को खोजते हैं ताकि आप इस "खोज को ऊपर उठाएँ" से मतलब रखें। आप इसे बकवास क्यों कहते हैं? क्योंकि यह पूरे फाइलसिस्टम को खोज रहा है?
लेओ लेपोल्ड हर्ट्ज़ '

2
क्योंकि sudo रूट अनुमतियों के साथ खोज कमांड चलाता है जो मूल रूप से एक बुरा विचार है। अलगाव और सबसे कम-विशेषाधिकार सिद्धांतों का उल्लंघन किया जाता है।
धुंध

3
यहाँ "उत्थान" विशेषाधिकारों का है, जड़ से, के साथ sudo। आप अपने पूरे सिस्टम को बग findया दुर्भावनापूर्ण संस्करण, या एक गलत आमंत्रण द्वारा गड़बड़ कर रहे हैं, जो अप्रत्याशित रूप से कुछ लिखता है, जो कि सामान्य विशेषाधिकार के साथ इसे चलाने पर ऐसा नहीं हो सकता।
त्रिवेणी tri

2

उपरोक्त में से किसी भी उत्तर ने मेरे लिए काम नहीं किया। इंटरनेट पर मुझे जो कुछ भी मिलता है, उस पर केंद्रित है: त्रुटियों को छिपाएं। प्रक्रिया रिटर्न-कोड / निकास-कोड को कोई भी ठीक से संभाल नहीं पाता है। मैं कुछ निर्देशिकाओं का पता लगाने और फिर उनकी सामग्री का निरीक्षण करने के लिए bash स्क्रिप्ट के भीतर कमांड फाइंड का उपयोग करता हूं। मैं बाहर-कोड का उपयोग करके कमांड खोजने में सफलता का मूल्यांकन करता हूं: एक शून्य मूल्य काम करता है, अन्यथा विफल रहता है।

ऊपर दी गई जवाब द्वारा माइकल Brux कभी कभी काम करता है। लेकिन मेरे पास एक परिदृश्य है जिसमें यह विफल रहता है! मैंने समस्या का पता लगाया और इसे स्वयं ठीक किया। मुझे फ़ाइलों को प्रून करने की आवश्यकता है जब:

it is a directory AND has no read access AND/OR has no execute access

प्रमुख मुद्दा यहाँ देखें: और / या। मेरे द्वारा पढ़ा गया एक अच्छा सुझाव दिया गया क्रम है:

-type d ! -readable ! -executable -prune

यह हमेशा काम नहीं करता है। इसका मतलब है जब एक मैच होता है तो एक प्रून ट्रिगर होता है:

it is directory AND no read access AND no execute access

जब रीड एक्सेस दी जाती है, तो अभिव्यक्तियों का यह क्रम विफल हो जाता है, लेकिन कोई निष्पादन पहुंच नहीं है।

कुछ परीक्षण के बाद मुझे इसके बारे में एहसास हुआ और अपनी शेल स्क्रिप्ट समाधान को इसमें बदल दिया:

अच्छा खोज / घर * / -maxdepth 5 -follow \ \ (-type
    d -a ! \-(-readable -a -executable \) \) -prune \
    -o \
    \ (-type d -a -readable -a - निष्पादन योग्य -a- "" $ {m_find_name} "\ -print

यहां संयुक्त अभिव्यक्ति के लिए "सत्य नहीं" रखना महत्वपूर्ण है:

has read access AND has execute access

अन्यथा इसकी पूर्ण पहुँच नहीं है, जिसका अर्थ है: इसे चुभाना। यह मेरे लिए एक परिदृश्य में काम करने वाला साबित हुआ जो पिछले सुझाए गए समाधान विफल रहे।

मैं टिप्पणी अनुभाग में प्रश्नों के लिए नीचे तकनीकी विवरण प्रदान करता हूं। यदि विवरण अत्यधिक हैं तो मैं माफी चाहता हूं।

  • ¿कमांड का उपयोग अच्छा क्यों है? मुझे यहां विचार आया । शुरू में मुझे लगा कि संपूर्ण फाइलसिस्टम को देखते समय प्रक्रिया प्राथमिकता को कम करना अच्छा होगा। मुझे एहसास हुआ कि यह मेरे लिए कोई मतलब नहीं है, क्योंकि मेरी स्क्रिप्ट कुछ निर्देशिकाओं तक सीमित है। मैंने -maxdepth को घटाकर 3 कर दिया।
  • ¿/ घर * / के भीतर खोज क्यों? यह इस धागे के लिए प्रासंगिक नहीं है। मैं गैर-विशेषाधिकार प्राप्त उपयोगकर्ताओं (रूट नहीं) के साथ स्रोत कोड संकलन के माध्यम से हाथ से सभी एप्लिकेशन इंस्टॉल करता हूं। वे "/ घर" के भीतर स्थापित हैं। मेरे पास कई बायनेरिज़ और संस्करण एक साथ रह सकते हैं। मुझे एक मास्टर-स्लेव फैशन में सभी निर्देशिकाओं, निरीक्षण और बैकअप का पता लगाने की आवश्यकता है। मेरे पास एक से अधिक "/ होम" (कई समर्पित सर्वर के भीतर चलने वाले डिस्क) हो सकते हैं।
  • ¿-प्रयोग क्यों? उपयोगकर्ता निर्देशिकाओं के लिए प्रतीकात्मक लिंक बना सकते हैं। यह उपयोगिता निर्भर करता है, मुझे मिले हुए निरपेक्ष रास्तों का रिकॉर्ड रखना होगा।

आपके उत्तर और अच्छी टिप्पणियों के लिए धन्यवाद! मैंने आपके उत्तर का बेहतर तरीके से पूर्वावलोकन करने के लिए यहाँ एक इनाम खोला। मुझे लगता है कि यह एक अच्छी खोज है पढ़ने को रोकने और पहुंच को निष्पादित नहीं करना। - - क्या आप कृपया समझा सकते हैं कि आप क्यों उपयोग करते हैं niceऔर find $HOME -maxdepth 5 -follow ...?
लेओ लेपोल्ड हर्ट्ज़ '

2
खोल स्क्रिप्ट के रूप में कहा गया है सामान्य प्रयोजन (केवल सूचियों निर्देशिका मिलान नहीं है ${m_find_name}), और प्रश्न के लिए प्रासंगिक नहीं कई विकल्प होते हैं ( nice, /home*, -maxdepth 5, -follow)। मैंने एक उत्तर जोड़ा है जो सामान्य उद्देश्य से शेष रहते हुए, 'पढ़ने योग्य लेकिन निष्पादन योग्य निर्देशिकाओं' के विशिष्ट मुद्दे को अधिक संक्षिप्त रूप से संबोधित करता है।
वेजर्डन

2

आप grep -v इनवर्ट-मैच का उपयोग कर सकते हैं

-v, --invert-match        select non-matching lines

इस तरह:

find . > files_and_folders
cat files_and_folders | grep -v "permission denied" > files_and_folders

जादू करना चाहिए


2

- = MacOS के लिए = -

उपनाम का उपयोग करके एक नया कमांड बनाएं: बस ~ / .bash_profile लाइन में जोड़ें:

alias search='find / -name $file 2>/dev/null'

और नई टर्मिनल विंडो में आप इसे कॉल कर सकते हैं:

$ file=<filename or mask>; search

उदाहरण के लिए:

$ फ़ाइल = आदि; खोज


1

यदि आप CSH या TCSH का उपयोग कर रहे हैं, तो यहां एक समाधान है:

( find . > files_and_folders ) >& /dev/null

यदि आप टर्मिनल पर आउटपुट चाहते हैं:

( find . > /dev/tty ) >& /dev/null

हालाँकि, जैसा कि "csh-whynot" FAQ बताता है, आपको CSH का उपयोग नहीं करना चाहिए।


मैं सभी txt फ़ाइलों को grep करना चाहता हूं और छिपी हुई फ़ाइलों / निर्देशिका को बाहर करना चाहता हूं, "संदेश को अस्वीकार कर दिया" संदेश को मुद्रित करने के लिए छोड़ दें। मैं csh खोल का उपयोग कर रहा हूं। मैंने नीचे कमांड का उपयोग किया है और वे काम नहीं कर रहे हैं। -type f -iname " .txt" -not -path '* / \। '| egrep -v "अनुमति अस्वीकृत" खोजें। -type f -iname " .txt" -not -path '* / \। '2> / देव / शून्य त्रुटि के नीचे हो रही है। खोजें: पथों की पूर्ववर्ती अभिव्यक्ति होनी चाहिए: 2 उपयोग: खोजें [-H] [-L] [-पी] [-ओवेल] [-D मदद करें | वृक्ष | खोज | प्रतिमा | दरें | ऑप्ट | निष्पादन] [पथ ...] [अभिव्यक्ति]
यादव
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.