سؤال كيف يمكنني جعل rm لا تعطي خطأ في حالة عدم وجود ملف؟


أنا أكتب makefile من شأنها تنظيف بعض الملفات عديمة الفائدة في نهاية التجميع. إذا تم بالفعل تحقيق هدف ، فسيتم بالطبع تخطي ذلك الهدف وقد لا يكون الملف غير المجدي موجودًا. لذلك إذا قمت بذلك:

rm lexer.ml interpparse.ml interpparse.mli

قد أحصل على أخطاء لأن أحد الملفات غير موجود. هل هناك طريقة لمعرفة ذلك rm لتجاهل هذه الملفات؟

في قراءة صفحة الرجل ، أرى الخيار التالي:

 -f          Attempt to remove the files without prompting for confirma-
             tion, regardless of the file's permissions.  If the file does
             not exist, do not display a diagnostic message or modify the
             exit status to reflect an error.  The -f option overrides any
             previous -i options.

الذي يبدو وكأنه تقريبيا ما أريده ، لكنني لست متأكدًا حقًا من جزء الأذونات. هل هناك طريقة للقيام بذلك؟


273
2017-11-27 16:43


الأصل


هل جربت بعض rm في رمل؟ يبدو مثل -f يفعل بالضبط ما تريد ، بغض النظر عن globbing. - JMD
إذا كانت الأذونات لن تسمح بذلك ، فإن rm سوف مع -f مازال يحاول حذفه. سوف تفشل. لن يخبرك أنه فشل. من المفيد إذا كان اسم الملف هو متغير أو كروي. - LawrenceC


الأجوبة:


ال -f الخيار هو بالتأكيد ما تريد استخدامه.

التأكيد على أذونات الملف الذي يشير إليه هو:

$ touch myfile    
$ chmod 400 myfile
$ rm myfile       
rm: remove write-protected regular empty file `myfile'?

وبالتالي rm سوف يحذرك إذا حاولت حذف ملف ليس لديك أذونات الكتابة عليه. هذا مسموح به إذا كان لديك أذونات الكتابة على الدليل ولكنها غريبة بعض الشيء ، وهذا هو السبب rm يحذرك عادة حول هذا الموضوع.


231
2017-11-27 16:54



معظم ، ولكن ليس كل الأنظمة سوف تسأل (على ما أظن). بعض تتطلب -i. - DaveParillo
إذا كنت تريد رسالة الخطأ ، ولكن ليس رمز إنهاء الخطأ ، فراجع الإجابة بـ جيل بيركرز. أنا أستعمل set -e في جميع برامجي bash النصية بحيث يخرج البرنامج النصي بعد أي أمر يعطي خطأ. غالباً ما أريد نصاً يخبرني إذا كان rm أعطى خطأ ، ولكن استمر على أي حال. لا يزال مستمرا. - cledoux


الحل الآخر هو هذا: https://stackoverflow.com/questions/11231937/bash-ignoring-error-for-a-particular-command

ما عليك سوى إضافة عبارة OR - بعد أمرك:

rm -rf my/dir || true

بهذه الطريقة ، عندما تفشل العبارة رقم 1 (يطرح الخطأ) ، قم بتشغيل العبارة رقم 2 ، والتي هي ببساطة true.


87
2018-03-09 12:39



فإنه يطبع الخطأ ويستمر التنفيذ ، الذي هو المطلوب لحالتي. - worldsayshi
أو فقط rm -rf my/dir ||: ليكون أكثر إيجازا (: هو اختصار ل true) - Godsmith
الحل الأفضل في رأيي. من السهل رؤية ما يحدث ولماذا يتم تجاهل رمز النتيجة. احب ذلك! - Mavamaarten


أنا متأخرة إلى الحفلة ، لكني استخدم هذا طوال الوقت. في makefile ، أضف - إلى بداية السطر لتجاهل قيمة الإرجاع لهذا الخط. مثل ذلك:

-rm lexer.ml interpparse.ml interpparse.mli

72
2017-12-23 23:12



سيظل هذا بطباعة الخطأ على وحدة التحكم رغم ذلك ، والذي يدربك لتجاهل الأخطاء في جعل الإخراج ، وهو على الأرجح ليس ما تريده. RM -RF هو خيار أفضل في رأيي. - Godsmith
Godsmith فما استقاموا لكم فاستقيموا بدلا تجاهل خطأ من إجبار المتكررة العودية. هذا يمكن أن يكون شقي جدا. +1 لتركيب makefile محددة - Daishi
إذا كان من الممكن أن يكون rm -rf "شقي" ، فهذا يعني أنك تستخدم خارج الدليل تحت التحكم في الإصدار. لماذا ا؟ - Godsmith
قدم رابطًا للوثائق ، من فضلك. يمكن العثور على وصف لهذه الميزة. - George Sovetov
GeorgeSovetov gnu.org/software/make/manual/make.html#Errors - Robert Li


إذا كنت لا ترغب في استخدام الخيار -f ، فسيكون البديل هو:

rm filethatdoesntexist 2> /dev/null 

سيؤدي هذا إلى منع الأخطاء من الطباعة.


8
2018-06-12 19:46



لسوء الحظ ، سيظل هذا الأمر رمزًا للخارج. - Shaun McDonald


إذا وجدت بعض الطريق ل غلوب أسماء الملفات ، rm لن يشتكي إن لم يعثر على تطابق. شيء من هذا القبيل lexer.m* interpparse.*، وما إلى ذلك يجب أن تعمل من أجلك (كن حذرا أنك لا تحذف الكثير ، بالطبع). أيضا، -f هي طريقة معقولة تمامًا ، طالما أنك لا تأمل في أن تحفظك أذونات الملفات من حذف ملف لا تريده - إذا كنت لا تريد حذفه ، فلا تضعه في قائمة.


7
2017-11-27 16:48



سيكون الغموض غير وارد لأنه يوجد ملف lexer.mll لا أريد حذفه. شكرا لإظهار لماذا -f معقول. أفترض أنني أميل إلى توخي الحذر بعد أن أخطأ عددهم sudo rm -rf . - Jason Baker
لا حتى أكثر تقييدا lexer.m? ...؟ من شأنه أن يمسك lexer.ml و lexer.mz، لكن لا lexer.mll أو lexer.mla. - JMD
JMD: أفترض أن ذلك يعتمد على shell الخاص بك و ما هو دعم تطابق النمط الذي يقدمه من أجل globbing. - Nick Bastin


الخيار -f يعني أنك لن تتم مطالبتك إذا كان هناك شيء غير متوقع. هذا لا يعني أنه لا يتم أخذ الأذونات في الاعتبار.

إذا لم تكن لديك امتيازات كافية لإزالة ملف ، فلن تتم إزالته.

لكن، إذا كان لديك امتيازات كافية لتغيير الامتيازات ، فستتم إزالة ملفك. هذه هي الحالة عندما تكون مالك ملف مع أذونات للقراءة للمالك (-r --------). كمالك ، يمكنك ذلك chmod u+w، ثم إزالته: rm -f سيزيل هذا الملف.


5
2017-11-27 19:27





ربما يمكن أن يساعد خطًا مشابهًا مع:

touch fakefile.exe fakefile.o && rm *.o *.exe

أعلم أن هذا ليس ذكيا جدا ، لكنه يقوم بهذه المهمة.


3
2018-03-11 10:36





بديل:

RmIfIsFile() {  for f in "$@"; do [ -f $f ] && rm $f; done; };  RmIfIsFile lexer.ml interpparse.ml interpparse.mli

يتعذر على Makefiles سيئة جدًا مشاركة تعريفات الدالة shell عبر الخطوط.


2
2017-11-27 17:44



هل حاولت استخدام \ (الشرطة المائلة للخارج) في نهاية الصف للسماح لها بالمتابعة في اليوم التالي؟ - some
some: نعم ، يمكن أن تنتشر عبر عدة أسطر ، ولكن لمشاركتها عبر الوصفات لديك لوضع التعريف في المتغير. - reinierpost


وإليك ما أستخدمه في نصوص shell. يخفي رسالة الخطأ ورمز الخطأ.

rm doesnotexist 2> /dev/null || echo > /dev/null

2
2018-06-11 13:55