it-swarm.asia

كيف أجعل rm لا يعطي خطأ إذا كان الملف غير موجود؟

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

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.

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

307
Jason Baker

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

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

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

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

266
Dave Webb

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

فقط أضف عبارة OR بعد أمرك:

rm -rf my/dir || true

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

110
Giel Berkers

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

-rm lexer.ml interpparse.ml interpparse.mli
74
Robert Li

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

rm filethatdoesntexist 2> /dev/null 

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

12
user135299

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

8
Nick Bastin

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

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

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

6
mouviciel

ربما يمكن أن تساعد في خط مماثل مع:

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

أعلم أن هذا ليس ذكيًا جدًا ، لكنه يؤدي المهمة.

4
Bogdan

بديل:

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

يتعذر على Makefiles سيء للغاية مشاركة تعريفات وظائف Shell عبر الخطوط.

3
reinierpost

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

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

اكتب rm -rf ppp>/dev/null 2>&1 رسالة أحدث رسالة خطأ. تحدث المشكلة ، إذا حدث خطأ ليس لـ STDERR 2 ولكن STDOUT 1 ... يحدث عندما يتم إنشاء الأمر وليس خطأ ولكن تحذير. تحتاج إلى تعيين عامل تصفية وإزالة هذه الرسالة. لكن هذه الحالة عادية.

1
Anatoly

يمكنك لمس الملفات قبل تحويلها. من شأنه أن يخلق لهم إذا لم تكن موجودة :-)

touch lexer.ml interpparse.ml interpparse.mli
rm lexer.ml interpparse.ml interpparse.mli
1
commonpike

اختبار لمعرفة ما إذا كان الملف موجودًا أولاً أم لا ، ثم قم بتمريره إلى rm. ثم الأخطاء من جمهورية مقدونيا ستكون ذات مغزى. - إذا كانت رسالة الخطأ أو تجاهلها هي عادة أكثر شمولًا مما يريده الشخص. قد تفعل أشياء لا تريد القيام بها.

if [ -f lexer.ml ]; then
  rm lexer.ml
fi

أضف مزيدًا من فقرات الاختبار إذا كان هناك المزيد من الملفات التي تريد التأكد من وجودها.

1
user244488