bash - मैं "ढूंढने" से सभी "अनुमति अस्वीकृत" संदेशों को कैसे बहिष्कृत कर सकता हूं?




error-handling find (12)

सरल उत्तर:

find . > files_and_folders 2>&-

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

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

जीएनयू के लिए मजबूत जवाब find :

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

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

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

मजबूत जवाब जो किसी भी पॉज़िक्स-संगत find (जीएनयू, ओएसएक्स / बीएसडी, आदि) के साथ काम करता है

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

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

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

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

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

find . > files_and_folders

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

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

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


- = MacOS के लिए = -

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

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

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

$ file=<filename or mask>; search

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

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


आप grep -v invert-match का उपयोग कर सकते हैं

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

इस तरह:

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

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


आप अपने खोज परिणामों को फ़ाइल में रखने का भी एक आसान समाधान है।

ढूंढो -नाम 'NameOfSearchedFile' >> results.txt


उपयोग

sudo find / -name file.txt

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


उपयोग:

find . ! -readable -prune -o -print

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

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

इसके साथ काम करता है: ढूंढें (जीएनयू निष्कर्ष) 4.4.2। पृष्ठभूमि:

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

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


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

द्वारा उपरोक्त उत्तर कभी-कभी काम करता है। लेकिन मेरे पास एक परिदृश्य है जिसमें यह विफल रहता है! मैंने समस्या की खोज की और इसे खुद तय कर दिया। मुझे फ़ाइलों को छीनने की आवश्यकता है जब:

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

यहां मुख्य मुद्दा देखें: AND / OR। एक अच्छा सुझाया गया शर्त अनुक्रम मैंने पढ़ा है:

-type d ! -readable ! -executable -prune

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

it is directory AND no read access AND no execute access

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

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

अच्छा खोज / घर * / -मैक्सडेप 5 -फॉलो \
\ (-प्रकार डी-ए ! \ (-readable -a -executable \) \) -प्रून \
-o \
\ (-टाइप डी-ए-रीडेबल -ए-एक्सटेक्टेबल-ए -नाम "$ {m_find_name}" \) -प्रिंट

यहां एक कुंजी अभिव्यक्ति के लिए "सत्य नहीं" है:

has read access AND has execute access

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

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

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

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

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

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

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

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


मुझे इसका इस्तेमाल करना पड़ा:

find / -name expect 2>/dev/null

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

उम्मीद की जा रही उम्मीद कार्यक्रम का स्थान होने की उम्मीद है।


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

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

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

  1. आप सुडो कमांड का उपयोग कर सकते हैं: sudo find /. -name 'toBeSearched.file' sudo find /. -name 'toBeSearched.file' । यह सुपर उपयोगकर्ता का पासवर्ड पूछता है, पासवर्ड दर्ज करते समय आप देखेंगे कि आप वास्तव में क्या चाहते हैं।

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

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

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

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

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

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

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

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

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


2> / dev / null का उपयोग कर पाइप stderr / dev / null

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





file-permissions