ගොනුවක් නොපවතී නම් rm දෝෂයක් නොදක්වන්නේ කෙසේද?


364

මම මේක්ෆයිල් එකක් ලියන්නේ එය සම්පාදනය අවසානයේ නිෂ් less ල ලිපිගොනු කිහිපයක් පිරිසිදු කරනු ඇත. ඉලක්කයක් දැනටමත් සකසා ඇත්නම්, එය ඇත්ත වශයෙන්ම එම ඉලක්කය මඟහරිනු ඇති අතර නිෂ් less ල ගොනුව එහි නොතිබිය හැකිය. එබැවින් මම මෙය කරන්නේ නම්:

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.

ශබ්ද කැමති පාහේ මම අවශ්ය දේ, නමුත් මම අවසර කොටසක් ගැන වග බලා ගන්න ඇත්තටම නැහැ. මෙය කිරීමට ක්‍රමයක් තිබේද?


ඔබ rmවැලිපිල්ලක කිහිපයක් උත්සාහ කළාද ? එය වගේ -fනොතකා globbing, ඔබට අවශ්ය දේ හරියටම කරනවා.
ජේඑම්ඩී

අවසර එයට ඉඩ නොදෙන්නේ නම්, -fවිකල්පය සමඟ rm එය මකා දැමීමට උත්සාහ කරයි. එය අසාර්ථක වනු ඇත. එය අසාර්ථක වූ බව එය ඔබට නොකියයි. ගොනු නාමය විචල්‍ය හෝ ග්ලෝබ් නම් ප්‍රයෝජනවත් වේ.
ලෝරන්ස් සී

සම්පූර්ණත්වය සඳහා පමණි: එය දෝෂ පිටවීමේ තත්වයක් ලබා නොදෙන ලෙස rm --interactive=neverක්‍රියා කරයි rm -f. : වැඩි විස්තර සඳහා මෙතන බලන්න unix.stackexchange.com/questions/72864/...
lesmana

ඔබ මේක්ෆයිල් ප්‍රශ්නයෙහි සඳහන් කර ඇති බැවින්, මම සිතන්නේ @ රොබට්ලිගේ පිළිතුර වඩාත් සුදුසු ය. '-' සමඟ සූදානම් වීම මෙය කළ හැකි ක්‍රමයකි; Makefiles සමඟ ගනුදෙනු කරන අනෙක් අය එය හඳුනා ගනීවි.
akauppi

Answers:


309

මෙම -fවිකල්පය ඔබ භාවිතා කිරීමට අවශ්ය දේ අනිවාර්යයෙන්ම වේ.

එය සඳහන් කරන ගොනු අවසරයන් පිළිබඳ තහවුරු කිරීම මෙයයි:

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

ඒ නිසා rmඔබ ගොනුව ඔබ ලියන්න අවසර නොමැත මකා ගැනීමට උත්සාහ නම් ඔබට අනතුරු අඟවයි. ඔබට ඩිරෙක්ටරියේ ලිඛිත අවසරයන් තිබේ නම් මෙය අවසර දී ඇති නමුත් එය ටිකක් අමුතුයි, ඒ නිසා rmසාමාන්‍යයෙන් ඔබට ඒ ගැන අනතුරු අඟවයි.


1
බොහෝ, නමුත් සෑම පද්ධතියක්ම අසන්නේ නැත (මම හිතන්නේ). සමහර ඒවා අවශ්‍යයි -i.
ඩේව්පරිලෝ

1
ඔබට දෝෂ පණිවිඩය අවශ්‍ය නම්, නමුත් දෝෂ පිටවීමේ කේතය නොවේ නම්, ජිල් බර්කර්ස්ගේ පිළිතුර බලන්න . set -eඕනෑම විධානයක් දෝෂයක් ලබා දීමෙන් පසුව ස්ක්‍රිප්ට් පිටවීම සඳහා මම මගේ සියලු බාෂ් ස්ක්‍රිප්ට් භාවිතා කරමි . මට බොහෝ විට අවශ්‍ය වන්නේ පිටපතක් rmදෝෂයක් තිබේදැයි මට පැවසීමටය, නමුත් කෙසේ හෝ ඉදිරියට යන්න. දිගටම.
cledoux

139

තවත් විසඳුමක් මෙයයි: /programming/11231937/bash-ignoring-error-for-a-particular-command

ඔබගේ විධානයෙන් පසු OR- ප්‍රකාශයක් එක් කරන්න:

rm -rf my/dir || true

මේ ආකාරයට, # 1 ප්‍රකාශය අසමත් වූ විට (දෝෂය විසි කරයි), ප්‍රකාශය # 2 ධාවනය කරන්න, එය සරලවම trueවේ.


4
එය දෝෂය මුද්‍රණය කර ක්‍රියාත්මක කිරීම දිගටම කරගෙන යයි.
worldsayshi

10
නැතහොත් rm -rf my/dir ||:ඊටත් වඩා සංක්ෂිප්ත වීමට ( :කෙටි වේ true)
ගොඩ්ස්මිත්

මගේ මතය අනුව වඩා හොඳ විසඳුම. සිදුවන්නේ කුමක්ද සහ ප්‍රති result ල කේතය නොසලකා හරිනුයේ ඇයිද යන්න පහසුවෙන් දැකගත හැකිය. මම එයට කැමතියි!
මාවමාර්ටන්

භාවිතා කිරීමේදී ස්ක්‍රිප්ට් බිඳීම වළක්වන එකම එක මෙයයිset -e
dmikam

80

මම සාදයට ප්‍රමාද වැඩියි, නමුත් මම මෙය නිතරම භාවිතා කරමි. Makefile එකක, -එම රේඛාවේ ප්‍රතිලාභ අගය නොසලකා හැරීම සඳහා පේළියක ආරම්භයට එක් කරන්න . එසේ වැනි:

-rm lexer.ml interpparse.ml interpparse.mli

9
මෙය තවමත් කොන්සෝලය වෙත දෝෂයක් මුද්‍රණය කරනු ඇත, එමඟින් නිමැවුම් ප්‍රතිදානයේ දෝෂ නොසලකා හැරීමට ඔබව පුහුණු කරයි, එය බොහෝ විට ඔබට අවශ්‍ය දේ නොවේ. rm -rf මගේ මතය අනුව වඩා හොඳ විකල්පයකි.
ගොඩ්ස්මිත්

Ods ගොඩ්ස්මිත් පුනරාවර්තන මකා දැමීමට බල කරනවාට වඩා දෝෂයක් නොසලකා හැරීමට කැමැත්තෙමි. මෙය ඉතා නරක විය හැකිය. සහ Makefile විශේෂිත වාක්‍ය ඛණ්ඩය සඳහා +1
ඩයිෂි

Rm -rf "නරක" විය හැකි නම්, එයින් අදහස් වන්නේ ඔබ අනුවාද පාලනය යටතේ ඇති නාමාවලියෙන් පිටත සෑදීම භාවිතා කරන බවයි. මන්ද?
ගොඩ්ස්මිත්

කරුණාකර ප්‍රලේඛනයට සබැඳියක් දෙන්න. මෙම අංගය පිළිබඳ විස්තරයක් සොයාගත හැකි විය.
ජෝර්ජ් සොවෙටොව්

1
මම හිතන්නේ මේක උසස්. -fඅන්තර්ක්‍රියාකාරී මාදිලිය මඟ හැරීම, කියවීමට පමණක් ඇති ලිපිගොනු මඟ හැරීම යනාදිය - කෙසේ වෙතත් මෙම විසඳුම OP ඉල්ලූ දේම කරයි.
phil294

15

ඔබට -f විකල්පය භාවිතා කිරීමට අවශ්‍ය නැතිනම්, විකල්පයක් නම්:

rm filethatdoesntexist 2> /dev/null 

මෙය දෝෂ මුද්‍රණය කිරීමෙන් වළක්වයි.


9
අවාසනාවට මෙය තවමත් දෝෂ පිටවීමේ කේතයක් ලබා දෙනු ඇත.
ෂෝන් මැක්ඩොනල්ඩ්

8

ගොනු නාමයන් ග්ලෝබ් කිරීමට ඔබ යම් ක්‍රමයක් සොයා rmගන්නේ නම්, එයට ගැලපීමක් සොයාගත නොහැකි නම් පැමිණිලි නොකරනු ඇත. එබැවින් lexer.m* interpparse.*යනාදිය වැනි දේ ඔබ වෙනුවෙන් වැඩ කළ යුතුය (ඔබ ඕනෑවට වඩා මකා නොදැමීමට වග බලා ගන්න, ඇත්ත වශයෙන්ම). එසේම, -fයන්නට ඉතා සාධාරණ ක්‍රමයක් වන අතර, ගොනු අවසරයන් ඔබට අවශ්‍ය නැති ගොනුවක් මකා දැමීමෙන් ඔබව ගලවා ගනු ඇතැයි ඔබ බලාපොරොත්තු නොවන තාක් කල් - ඔබට එය මකා දැමීමට අවශ්‍ය නැතිනම් එය දමන්න එපා ලැයිස්තුවේ.


මට මැකීමට අවශ්‍ය නොවන lexer.mll ගොනුවක් ඇති බැවින් ග්ලෝබින් කිරීම ප්‍රශ්නයක් නොවේ. -F සාධාරණ වන්නේ මන්දැයි පෙන්වීමට ස්තූතියි. නොමඟ ගිය බොහෝ අයගෙන් පසු මම ඕනෑවට වඩා පරෙස්සම් වීමට සිතමි sudo rm -rf.
ජේසන් බේකර්

ඊටත් වඩා සීමිත lexer.m?නොවේද ...? එය අල්ලා ඇත lexer.mlහා lexer.mz, නමුත් lexer.mllහෝ lexer.mla.
ජේඑම්ඩී

1
@ ජේඑම්ඩී: මම හිතන්නේ එය ඔබේ කවචය මත රඳා පවතින අතර එය ගෝලීයකරණය සඳහා ලබා දෙන රටා ගැලපෙන සහයෝගය මත ය.
නික් බැස්ටින්

6

-F විකල්පය යන්නෙන් අදහස් කරන්නේ යමක් බලාපොරොත්තු වූ පරිදි සිදු නොවන්නේ නම් ඔබෙන් විමසනු නොලබන බවයි. අවසරයන් සැලකිල්ලට නොගන්නා බව එයින් අදහස් නොවේ.

ගොනුවක් ඉවත් කිරීමට ඔබට ප්‍රමාණවත් වරප්‍රසාද නොමැති නම්, එය ඉවත් නොකෙරේ.

එහෙත් , වරප්‍රසාද වෙනස් කිරීමට ඔබට ප්‍රමාණවත් වරප්‍රසාද තිබේ නම්, ඔබ ගොනු ඉවත් කරනු ලැබේ. ඔබ හිමිකරුට කියවීමට පමණක් අවසර ඇති ගොනුවක හිමිකරු වන විට මෙය සිදු වේ (-r --------). හිමිකරු ලෙස, ඔබට chmod u+wඑය ඉවත් කළ හැකිය: rm -fඑම ගොනුව ඉවත් කරනු ඇත.


5

සමහර විට සමාන රේඛාවකට උදව් විය හැකිය:

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

මෙය ඉතා බුද්ධිමත් නොවන බව මම දනිමි, නමුත් එය කාර්යය ඉටු කරයි.


3

විකල්පයක්:

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

ඉතා නරක මේක්ෆයිල්ස් වලට ෂෙල් ක්‍රියාකාරී අර්ථ දැක්වීම් රේඛා හරහා බෙදා ගත නොහැක.


පේළියක අවසානයේ \ (බැක්ස්ලෑෂ්) භාවිතා කිරීමට ඔබ උත්සාහ කර තිබේද?
සමහර

@ සමහර: ඔව්, ඒවා විවිධ රේඛා හරහා පැතිර යා හැකි නමුත් ඒවා වට්ටෝරු හරහා බෙදා ගැනීමට ඔබට අර්ථ දැක්වීම සාදන්න විචල්‍යයකට දැමිය යුතුය.
රිනියර්පොස්ට්

3

මෙන්න මම ෂෙල් ස්ක්‍රිප්ට් වල භාවිතා කරන දේ. එය දෝෂ පණිවිඩය සහ දෝෂ කේතය සඟවයි.

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

කොහොමදrm doesnotexist 2&> /dev/null
user8162

2

ගොනුව පළමුව තිබේදැයි පරීක්ෂා කරන්න, එය එසේ නම්, එය rm වෙත යොමු කරන්න. එවිට rm වෙතින් වන දෝෂ අර්ථවත් වනු ඇත. -f හෝ වැරදි පණිවිඩය නොසලකා හැරීම සාමාන්‍යයෙන් පුද්ගලයෙකුට අවශ්‍ය දේට වඩා වැඩි ය. -f ඔබට අවශ්‍ය නැති දේවල් කරයි.

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

ඔබට තවත් ලිපිගොනු තිබේ නම් තවත් පරීක්ෂණ වගන්ති එක් කරන්න.


1

ගොනු rm කිරීමට පෙර ඔබට ඒවා ස්පර්ශ කළ හැකිය. ඒවා නොපවතී නම් එය නිර්මාණය කරයි :-)

touch lexer.ml interpparse.ml interpparse.mli
rm lexer.ml interpparse.ml interpparse.mli

1

ලියන්න rm -rf ppp>/dev/null 2>&1 ආඥාවක් නොවන දෝෂයක් නමුත් අනතුරු ඇඟවීමක් ජනනය විට, ඔබ ගැටළු ඇතිවේ නවතම හමුවීමක් දෝෂ දෝෂයක් STDERR 2 නමුත් STDOUT 1 නොකරන ජනනය නම් ... ඒක ගනිත් තැනක්. ඔබට පෙරණය සකසා මෙම පණිවිඩය ඉවත් කළ යුතුය. නමුත් මෙම නඩුව සාමාන්යයි.

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.