find - exec rm vs -delete


296

මම මෙම විධාන දෙක අතර වෙනස තේරුම් ගැනීමට උත්සාහ කරමි:

sudo find / -name .DS_Store -delete

හා

sudo find / -name ".DS_Store"  -exec rm {} \;

execක්‍රමයට වැඩි කැමැත්තක් දක්වන බව මම දුටුවෙමි . මන්ද? වඩා ආරක්ෂිත / වේගවත් / වඩා හොඳ කුමක්ද? මම මගේ මැක්බුක්හි දෙකම භාවිතා කර ඇති අතර සියල්ල හොඳින් ක්‍රියාත්මක වන බව පෙනේ.

Answers:


282

-delete ගැලපෙන සෑම ගොනුවක් සඳහාම බාහිර ක්‍රියාවලියක් ඇති කිරීමට අවශ්‍ය නොවන නිසා එය වඩා හොඳින් ක්‍රියා කරයි.

සෑම අනුවාදයකම නොපවතින -exec rm {} \;බැවින් බොහෝ විට නිර්දේශිත බව ඔබට පෙනෙනු -deleteඇත find. මට දැන් පරීක්ෂා කළ නොහැක, නමුත් මට විශ්වාසයි මම එය findනොමැතිව භාවිතා කර ඇති බව.

මෙම ක්‍රම දෙකම "ආරක්ෂිත" විය යුතුය.

@ ඩොයිට්මිවේ වෙතින් අදහස් දැක්වීමකට සංස්කරණය කරන්න: ඔබ නමට ගැළපෙන බවට වග බලා ගන්න , පසුව මකා දමන්න, අනෙක් පැත්තෙන් නොව (මකන්න, පසුව ගැලපෙන්න). නැතිනම් සෑම ගොනුවක්ම ගැලපුණත් නැතත් මකා දැමෙනු ඇත . එනම්, එපා මෙය කරන්න: find / -delete -name .DS_Store.

ගැලපෙන සෑම ගොනුවක් සඳහාම බාහිර ක්‍රියාවලියක් ඇතිවීම වළක්වා ගැනීම සඳහා පොදු ක්‍රමයක් වන්නේ:

find / -name .DS_Store -print0 | xargs -0 rm

(නමුත් මෙහි අතේ ගෙන යා හැකි ගැටළුවක් ඇති බව සලකන්න: සොයා ගැනීමේ සෑම අනුවාදයකම නොමැත -print0!)


3
මට පේනවා. නිශ්චිත ගොනු ගස මකා දැමීමට -deleteපෙර ස්විචය භාවිතා කිරීම ද මම කියවා ඇත්තෙමි -name, එබැවින් මම පරිස්සම් විය යුතු යැයි සිතමි.
ලූනු

8
මෑතදී findඔබට -exec rm {} +ගැලපෙන සියලුම ගොනු තනි rmවිධානයකින් ඉවත් කිරීමට භාවිතා කළ හැකිය .
jimmij

3
.DS_Storeවිශේෂ අක්ෂර කිසිවක් අඩංගු නොවේ, එබැවින් උපුටා දැක්වීම් අනවශ්‍ය වන අතර මෙම අවස්ථාවේදී කිසිවක් වෙනස් නොවේ.
සෙලාඩා

1
මූලික වශයෙන් සුදු අවකාශය (අවකාශ, ටැබ්, සමහර විට වෙනත්) පමණක් නම් නොකල නූලක් වෙනම විධාන රේඛා තර්ක දෙකක් ලෙස අර්ථ දැක්වීමට හේතු වේ, නමුත් උපුටා දැක්විය යුතුද නැද්ද යන්න තීරණය කිරීමේදී ඔබට කණගාටු විය යුත්තේ එපමණකි. ඔබ ගැන කරදර වෙන්න ඕනේ සියලු වැනි ෂෙල් metacharacters ;හෝ |හෝ >හෝ <උපුටා නම් හා '' සහ තවත් අය බොහෝ ෂෙල් විශේෂ අර්ථයක් ඇති.
සෙලාඩා

2
Ar මාකෝමාර්සාලා xargsසීමිත ප්‍රමාණයේ තර්ක ලැයිස්තු ගැටළුව විනිවිදභාවයෙන් බලාගන්නේ එය විධානයෙහි බහුවිධ ආයාචනා වලට බෙදීමෙනි .
සෙලාඩා

30

.DS_Storeනාමාවලි නොව ලිපිගොනු නියෝජනය කරයි යැයි උපකල්පනය කිරීම , එය කළ හැකි වඩාත්ම අතේ ගෙන යා හැකි වේගවත්ම ක්‍රමය වනුයේ:

sudo find / -name .DS_Store -exec rm {} +

එකම අවදානම වන්නේ ලබා ගත sudoනොහැකි වීමයි. නමුත් වර්තමානයේ එය තරමක් අඩුය.

මෙම -deleteසොයා තවමත් අනෙක් බොහෝ නොවන සම්මත වේ GNU ඉල්ලා භාවිතා විකල්පය findසඳහා, එසේ සෑම විටම ලබා ගත හැකි නොවේ.

ගොනු පද්ධතියේ ඇති සෑම අවස්ථාවකටම විධානය ක්‍රියාත්මක නොකිරීමෙන් විධාන අවසන් +කිරීම වගන්තිය \;ඉතා ප්‍රශස්ත කරයි .execrm.DS_Store


17

ඔබගේ මැක්බුක් වැනි යන්ත්‍රයක් සඳහා විධාන දෙක අතර ක්‍රියාකාරීත්වයේ විශාල වෙනසක් ඔබට සොයාගත නොහැක. කෙසේ වෙතත්, ඔබ -exec අනුවාදය දෙස බැලුවහොත් ඔබට සියුම් වෙනසක් දැකිය හැකිය:

sudo find / -iname ".file-to-delete"  -exec rm {} \;

මෙයින් අදහස් කරන්නේ ".file-to-delete" යන නම සහිත සියලුම ගොනු ඔබ සොයා ගන්නා බවයි. කෙසේ වෙතත් මෙම සෙවීම මඟින් අනවශ්‍ය ව්‍යාජ ධනාත්මක කරුණු ලබා දෙනු ඇත. සුඩෝ සමඟ යමක් කරන විට ඔබ ටිකක් පරිස්සම් විය යුතුය. -Exec rm using using භාවිතා කිරීමේ වාසිය නම් ඔබට මේ ආකාරයට rm වෙත තර්ක ඉදිරිපත් කළ හැකිය:

sudo find / -iname "*~"  -exec rm -i {} \;

මෙම උදාහරණයේ දී මට අවශ්‍ය වන්නේ ඉමාක්ස් විසින් සාදන උපස්ථ ගොනු ඉවත් කිරීමයි. කෙසේ වෙතත්, එම ටිල්ඩ් මා නොදන්නා සමහර අපැහැදිලි ගොනුවක තිබිය හැකි අතර එය වැදගත් විය හැකිය. ප්ලස් මට මකාදැමීම තහවුරු කිරීමට අවශ්‍යයි. එබැවින් මම '-i' විකල්පය rm විධානය මත තැබුවෙමි. මෙය මට අන්තර්ක්‍රියාකාරී මකාදැමීමක් ලබා දෙනු ඇත.

ඩිරෙක්ටරි සහ ලිපිගොනු මකා දැමීමට rm භාවිතය ඔබට ශෝධනය කළ හැකිය:

find /usr/local/share/ -iname "useless" -exec rm -r {} \;

කෙටියෙන් කිවහොත්, සොයාගත් අයිතමය ඉවත් කරන සත්‍ය විධානය මත -exec ඔබට තව ටිකක් පාලනය කරයි. වාසිය නම් ඔබ ලිපිගොනු සොයා ගැනීමට එක් මෙවලමක්, ඒවා ඉවත් කිරීමට තවත් මෙවලමක් භාවිතා කිරීමයි. සොයා ගැනීමේ උපයෝගීතාවයේ සෑම අනුවාදයකටම -delete විකල්පය නොමැත. එබැවින් සෑම මෙවලමක්ම නිසි රැකියාව සඳහා භාවිතා කිරීම වඩා හොඳය. මෙය යුනික්ස් දර්ශනයයි - එක් මෙවලමක්, එක් රැකියාවක්, ඔබ කළ යුතු දේ කිරීමට ඒවා එකට භාවිතා කරන්න.


5
අන්තර්ක්‍රියාකාරී තහවුරු -ok rm {} \;කිරීම -exec rm {} \;සඳහා ද බලන්න .
කුසලනන්ද
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.