[bash] كيف يمكنني استبعاد جميع رسائل "تم رفض الإذن" من "العثور على"؟


Answers

استعمال:

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 بتصفية الإخراج القياسي (يمكنك أن تقرر مدى انتقائية ما تريده ، وقد تضطر إلى تغيير التهجئة حسب الإعدادات المحلية و O / S) ، أما النهايتين >&2 فيعني ذلك أن رسائل الخطأ الباقية (مكتوبة على المخرجات القياسية) انتقل إلى الخطأ القياسي مرة أخرى. يمكن اعتبار إعادة التوجيه النهائية اختيارية في المحطة ، ولكن ستكون فكرة جيدة جدًا لاستخدامها في برنامج نصي بحيث تظهر رسائل الخطأ على خطأ معياري.

هناك اختلافات لا نهاية لها في هذا الموضوع ، اعتمادا على ما تريد القيام به. سيعمل هذا على أي نوع من Unix مع أي مشتق من Bourne shell (Bash، Korn،…) وأي إصدار من find متوافق مع POSIX.

إذا كنت ترغب في التكيف مع الإصدار المحدد find على نظامك ، فقد تتوفر خيارات بديلة. غنو find وجه الخصوص لديها خيارات لا تعد ولا تحصى غير متوفرة في الإصدارات الأخرى - انظر الإجابة المقبولة حاليا لمجموعة واحدة من هذه الخيارات.

Question

أحتاج لإخفاء جميع الأذونات التي تم رفضها من:

find . > files_and_folders

أقوم بتجربة عندما تظهر هذه الرسالة. أحتاج إلى جمع كل المجلدات والملفات ، التي لا تنشأ فيها.

هل من الممكن توجيه مستويات الأذونات إلى ملف files_and_folders ؟

كيف يمكنني إخفاء الأخطاء في نفس الوقت؟




إذا كنت تريد بدء البحث من الجذر "/" ، فسترى على الأرجح بعض الخطوات مثل:

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' sudo find /. -name 'toBeSearched.file' . يطلب كلمة مرور المستخدم الفائق ، عند إدخال كلمة المرور سترى النتيجة ما تريد حقا.

  2. يمكنك استخدام إعادة توجيه إخراج الخطأ القياسي من (بشكل عام للشاشة / الشاشة) إلى بعض الملفات وتجنب رؤية رسائل الخطأ على الشاشة! إعادة توجيه إلى ملف خاص / dev / null:

    find /. -name 'toBeSearched.file' 2>/dev/null
    
  3. يمكنك استخدام إعادة توجيه إخراج الخطأ القياسي من (بشكل عام للشاشة / الشاشة) إلى الإخراج القياسي (بشكل عام للشاشة / الشاشة) ، ثم توجيه الأنبوب باستخدام الأمر grep مع -v "invert" إلى عدم رؤية خطوط الإخراج التي تحتوي على "تم رفض الإذن" أزواج الكلمات:

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



لتجنب الإذن فقط بمنع التحذيرات ، أخبر العثور على تجاهل الملفات غير القابلة للقراءة عن طريق تشذيبها من البحث. أضف تعبيرًا كـ OR إلى بحثك ، مثل

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

هذا يقول في الغالب إلى (تطابق ملف غير قابل للقراءة وتقليمه من القائمة) أو (تطابق اسم مثل * .jbd وعرضه [مع ls]) . (تذكر أن تعبيرات AND يتم معا بشكل افتراضي إلا إذا كنت تستخدم - أو.) تحتاج إلى -ls في التعبير الثاني وإلا قد يؤدي البحث إلى إضافة إجراء افتراضي لإظهار أي تطابق ، والذي سيعرض أيضًا جميع الملفات غير القابلة للقراءة .

ولكن إذا كنت تبحث عن ملفات حقيقية على نظامك ، فلا يوجد عادة سبب للنظر في / dev ، والذي يحتوي على العديد من الملفات ، لذلك يجب عليك إضافة تعبير يستبعد هذا الدليل ، مثل:

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

لذلك (قم بمطابقة ملف غير قابل للقراءة وتقليم من القائمة) أو (مطابقة المسار / dev والتشذيب من القائمة) أو (تطابق ملف مثل * .jbd وعرضه) .




إعادة توجيه الخطأ القياسي. على سبيل المثال ، إذا كنت تستخدم bash على جهاز unix ، فيمكنك إعادة توجيه الخطأ القياسي إلى / dev / null على النحو التالي:

find . 2>/dev/null >files_and_folders



أي من الإجابات المذكورة أعلاه عملت بالنسبة لي. كل ما أجده على الإنترنت يركز على: إخفاء الأخطاء. لا شيء يعالج بشكل صحيح عملية رمز العودة / رمز إنهاء. يمكنني استخدام الأمر الموجود داخل نصوص bash لتحديد بعض الأدلة ثم فحص محتواها. أقيّم الأمر في العثور على النجاح باستخدام رمز الإنهاء: قيمة صفر تعمل ، وإلا ستفشل.

الإجابة التي قدمها تعمل في بعض الأحيان. لكن لدي سيناريو واحد يفشل فيه! اكتشفت المشكلة وثبتتها بنفسي. أحتاج إلى تقليم الملفات عندما:

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

انظر المشكلة الرئيسية هنا: و / أو. أحد تسلسلات الحالة الجيدة التي قرأتها هي:

-type d ! -readable ! -executable -prune

هذا لا يعمل دائما. هذا يعني أنه يتم تشغيل prune عندما تكون المطابقة:

it is directory AND no read access AND no execute access

يفشل هذا التسلسل من التعبيرات عند منح حق الوصول للقراءة ولكن لا يوجد وصول تنفيذ.

بعد إجراء بعض الاختبارات ، أدركت ذلك وغيّرت حل برنامجي النصي shell إلى:

العثور على لطيفة / المنزل * / -maxdepth 5 -follow \
\ (نوع د-أ ! \ (-قراءة -تنفيذية \) \) -البرون \
-o \
\ (-type d -a -readable -a -executable -a -name "$ {m_find_name}" \) -print

المفتاح هنا هو وضع "غير صحيح" للتعبير المشترك:

has read access AND has execute access

وإلا فإنه ليس لديه وصول كامل ، مما يعني: تقليمه. وقد أثبت هذا نجاحًا بالنسبة لي في أحد السيناريوهات التي فشلت فيها الحلول المقترحة السابقة.

أقدم أدناه التفاصيل الفنية للأسئلة في قسم التعليقات. أعتذر إذا كانت التفاصيل مفرطة.

  • ¿لماذا استخدام الأمر لطيف؟ لدي فكرة here في البداية اعتقدت أنه سيكون من الجيد تقليل أولوية العملية عند النظر إلى نظام ملفات بأكمله. أدركت أنه لا معنى لدي ، حيث أن نصي يقتصر على بعض الدلائل. خفضت -maxdepth إلى 3.
  • ¿لماذا البحث داخل / المنزل * /؟ هذا غير مناسب لهذا الموضوع. أقوم بتثبيت جميع التطبيقات باليد عن طريق ترجمة التعليمات البرمجية المصدر مع المستخدمين غير المميزين (وليس الجذر). يتم تثبيتها داخل "/ المنزل". يمكنني الحصول على ثنائيات ونسخ متعددة تعيش معًا. أحتاج لتحديد موقع جميع الدلائل وفحصها ونسخها احتياطيًا بطريقة رئيسية. يمكنني الحصول على أكثر من "منزل" (عدة أقراص تعمل داخل خادم مخصص).
  • ¿لماذا استخدام -follow؟ يمكن للمستخدمين إنشاء روابط رمزية إلى الدلائل. انها فائدة تعتمد ، ولست بحاجة للحفاظ على سجل من المسارات المطلقة وجدت.



تتم طباعة هذه الأخطاء إلى إخراج الخطأ القياسي (fd 2). لتصفية هذه الخوادم ، ما عليك سوى إعادة توجيه جميع الأخطاء إلى / dev / null:

find . 2>/dev/null > some_file

أو الانضمام لأول مرة stderr و stdout ثم grep من تلك الأخطاء المحددة:

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



- = بالنسبة إلى MacOS = -

إنشاء أمر جديد باستخدام الاسم المستعار: ما عليك سوى إضافة سطر ~ / .bash_profile:

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

وفي نافذة Terminal الجديدة يمكنك الاتصال به:

$ file=<filename or mask>; search

فمثلا:

$ file = etc؛ بحث




أنت أيضًا حل سهل لوضع نتائج البحث في ملف.

تجد . -name 'NameOfSearchedFile' >> results.txt




أنبوب stderr إلى /dev/null باستخدام 2> / dev / null

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






Links