`සොයා ගැනීම 'ප්‍රතිදානය මත පදනම්ව නාමාවලි මකා දැමිය හැක්කේ කෙසේද?


173

.Svn නාමාවලි සොයා ගැනීම සඳහා මම පහත විධානය නිකුත් කරමි:

find . -name ".svn"

එය මට පහත ප්‍රති results ල ලබා දෙයි:

./toto/.svn
./toto/titi/.svn
./toto/tata/.svn

rm -frනාමාවලි සහ ඒවායේ අන්තර්ගතය මකා දැමීම සඳහා මෙම සියලු රේඛා සකසන්නේ කෙසේද?


4
GNU සොයා ගැනීමට -deleteවිකල්පයක් ඇත.
මාකෝ

5
නැතහොත් ඔබට -exec rm -r "{}" \;සොයාගැනීමේ අවසානයට එකතු කළ හැකිය - භාවිතා කිරීමේදී ප්‍රවේශම් වන්න rm -r! :)
ඩ්‍රව් ස්ලෝන්

12
Ar මාකෝ මකාදැමීමේ විකල්පය නාමාවලිවල වැඩ කරන බවක් නොපෙනේ.
ආර්නාඩ්

UpSuperChafouin ලිපිගොනු සහ නාමාවලි වල එය හොඳින් ක්‍රියාත්මක වේ. කාරණය වන්නේ එය මකා දමන්නේ emtpy නාමාවලි -name ".svn"පමණක් වන අතර ඔබ එය සඳහන් කළ විට එය ගැලපෙන්නේ නාමාවලියට පමණක් මිස .svnනාමාවලියෙහි ඇති ගොනු වලට නොවේ .svn.
මාකෝ

1
Up සුපර් චැෆවුන් නමුත් ඒවායේ ඇති අවකාශයන් සහිත මාර්ග සඳහා ක්‍රියා නොකරනු ඇත (එබැවින් -execඋපුටා දැක්වීම් සමඟ භාවිතා කිරීම "{}").
ඩ්‍රව් ස්ලෝන්

Answers:


218

-execසොයාගැනීමෙන් එය සොයා ගන්නා සෑම ගැලපීමක් සඳහාම විකල්පය සමඟ තර්ක ක්‍රියාත්මක කළ හැකිය . එය නිර්දේශිත යාන්ත්‍රණයකි, මන්ද ඔබට අවකාශ / නව රේඛා සහ ඒවායේ ඇති වෙනත් අක්ෂර නිවැරදිව හැසිරවිය හැකිය. ඔබට ඩිරෙක්ටරිය ඉවත් කිරීමට පෙර ඩිරෙක්ටරියේ අන්තර්ගතය මකා දැමීමට සිදුවනු ඇත, එබැවින් මෙය සාක්ෂාත් කර ගැනීම -rසඳහා rmවිධානය සමඟ භාවිතා කරන්න.

ඔබේ උදාහරණය සඳහා ඔබට නිකුත් කළ හැකිය:

find . -name ".svn" -exec rm -r "{}" \;

චෙක්පතක් එක් කිරීමෙන් .svn නම් නාමාවලි සොයා ගැනීමට ඔබට සොයා ගත හැකිය -type d:

find . -name ".svn" -type d -exec rm -r "{}" \;

අනතුරු භාවිත rm -rඅවවාදය සමග එය ෆෝල්ඩරය හා එහි අන්තර්ගතය දමයි.

ඔබට හිස් ඩිරෙක්ටරි මෙන්ම හිස් ඩිරෙක්ටරි පමණක් අඩංගු ඩිරෙක්ටරි මකා දැමීමට අවශ්‍ය නම්, සොයා ගැනීමට එය කළ හැක්කේ -deleteසහ -empty:

find . -name ".svn" -type d -empty -delete

27
මම හැම විටම ක්රියාත්මක කිරීමට උපදෙස් දැක -type පසු -name ඇමතුම් කිරීමට පටන් සොයා විධානයන් statවර්ගය ලබා ගැනීමට මිල අධික වේ. මම එය තරමක් විශාල ලිපිගොනු පොකුරක් මත අත්හදා බැලුවෙමි, එය සත්‍යයක් බව පෙනේ: ධාවනය find . -name 'foo' -type dතත්පර 19 ක් ගත වූ අතර find . -type d -name 'foo'තත්පර 32 ක් ගතවිය. එබැවින් -typeපළමුව ධාවනය කිරීමට 50% ක් පමණ දිගු කාලයක් .
භ්‍රමණය

9
මම වසර ගණනාවක් තිස්සේ මෙම විධානය භාවිතා කර ඇත, නමුත් මැක්හි දැන් එම නාමාවලි නොපවතින බව පවසමින් මට දෝෂ තිබේ. එය ඒවා මකා දැමුවද. මම මීට පෙර කවදාවත් පණිවිඩ දැක නැත.
chovy

1
@ චොවි හා සමානයි. මෙම පණිවිඩ ඉවත් කිරීමට ක්‍රමයක් තිබේද?
ක්ලෙමන්ට්

2
@chovy @ clément එයට හේතුව findඑම ෆෝල්ඩරය වෙනත් තරඟ සඳහා දැකීමට අවශ්‍ය වන අතර එය එකවරම ෆෝල්ඩරය ඉවත් කිරීමයි. This මෙය නිවැරදි කරන්නේ කෙසේදැයි මම තවමත් නොදනිමි. ~ අපිරිසිදු නිවැරදි කිරීම:find . -name "folder-to-delete" -print0 | xargs -r0 -- rm -r
චාලි

6
@chovy @ Clément මම හිතන්නේ -depthතර්කය මෙය නිවැරදි කරයි:find . -depth -name ".svn" -type d -exec rm -r "{}" \;
gimboland

79

පිළිගත් පිළිතුරු මාර්ගයට වඩා වේගවත් අතේ ගෙන යා හැකි මෙන්න.

විධාන +ටර්මිනේටරය ලෙස අර්ධ සළකුණක් වෙනුවට භාවිතා findකිරීම CPU භාවිතය ප්‍රශස්ත කරයි. ඔබට .svnඋප නාමාවලි විශාල ප්‍රමාණයක් තිබේ නම් එය වැදගත් වේ :

find . -name .svn -type d -exec rm -rf {} +

ඔබ කවදාවත් බව ද සටහන 1 මෙහි කිරීමට සඟල උපුටා යොමු කළ යුතුව තිබේ.

1 ඔබ fishකවචය භාවිතා නොකරන්නේ නම් (මා මෙම පිළිතුර ලිවූ දා සිට මෙය නිවැරදි වන්නට ඇත).


5
+ සහ අර්ධ සළකුණ අතර වෙනස කුමක්ද? අපි කැරලි වරහන් භාවිතා නොකරන්නේ ඇයි?
ෂිචෙන් ගුඕ

1
Hic ෂිචෙන්ගුඕ අර්ධ සළකුණ සමඟ, එක් ඩිරෙක්ටරියක් සඳහා එක් rm විධානයක් සොයාගත හැකි අතර, + තනි rm විධානයක් මඟින් සොයාගත් සියලුම නාමාවලි ක්‍රියාවට නංවනු ඇත (හෝ අවම වශයෙන් ඒවායින් ඉතා විශාල සංඛ්‍යාවක්.) මට ඔබේ දෙවන ප්‍රශ්නය ලැබෙන්නේ නැත, කැරලි වරහන් මෙහි භාවිතා වේ.
jlliagre

මම හිතන්නේ h ෂිචෙන්ගුඕ යන්නෙන් අදහස් කරන්නේ ඇයි අපි මෙහි රැලි සහිත වරහන් උපුටා දැක්වීමට අවශ්‍ය නොවන්නේ (l ජ්ලියග්‍රේ ලිව්වේ අපට ඒවා කිසි විටෙකත් උපුටා දැක්විය යුතු නැති බවයි). මට දැන් යොමු කිරීමක් සොයාගත නොහැක, නමුත් මට තේරෙන්නේ find find සඳහා ප්‍රතිස්ථාපනය කළ මාර්ග ස්වයංක්‍රීයව සොයා ගන්නා බැවිනි.
ක්වින් කොමෙන්ඩන්ට්

+ කරන්නේ කුමක්ද යන්න පිළිබඳ පිළිතුර සහ ප්‍රශ්නය නිවැරදි නොවේ. බොහෝ ලිපිගොනු හමු වුවහොත් ';' 'විධාන රේඛාව දිග වැඩියි' දෝෂයක් ලබා දෙයි. + උපරිම අවසර ලත් විධාන රේඛා දිගට වඩා අඩු කාණ්ඩවල ඇති ගොනු බෙදී එක් එක් කණ්ඩායම සඳහා විධානය ක්‍රියාත්මක කරයි.
gaoithe

1
@gaoithe මම ඔබ විසින් සංස්කරණය කරන ලද අතර එය නිවැරදි ප්‍රකාශයක් වෙනුවට වැරදි ප්‍රකාශයක් ආදේශ කළෙමි. භාවිතා + කරන්නේ , CPU භාවිතය අවම භාවිතා ; කරන්නේ නැත විධාන කිරීමට බොහෝ කාලයක් දෝෂයක් විය.
jlliagre

30

ඔබ gnu find භාවිතා කරන බව උපකල්පනය කරන්න , ඔබට -deleteවිකල්පය භාවිතා කළ හැකිය:

find . -name test -delete

මතක තබා ගැනීම පහසුය.


විධානය පිළිබඳ පැහැදිලි කිරීමක් සමඟ ඔබේ ලිපිය පුළුල් කිරීම සලකා බලන්න (හෝ ඔබේ විසඳුම උපස්ථ කිරීමට ලියකියවිලි). බොහෝ විට පේළි පිළිතුරු එකක් (හෝ දෙකක්) වඩාත්ම දීප්තිමත් නොවේ.
HalosGhost

104
මෙය හිස් නොවන නාමාවලි වල ක්‍රියා නොකරයි.
belacqua

2
මැක් ඕඑස් එක්ස් හි ද ක්‍රියා කරයි
අදින්න

මෙය හිස් නොවන ෆෝල්ඩරය සඳහා ක්‍රියා නොකරන නමුත් එය පහසු සහ ආරක්ෂිත විසඳුමයි
රූසෝ

1
විකල්ප අනුපිළිවෙල ඉතා වැදගත් වේ, සොයා ගැනීම මඟින් ඒවා පිළිවෙලට ක්‍රියාත්මක කරනු ඇත, -ඩීලෙට් එක අන්තිම එක විය යුතුය
ජෝස් ඉග්නේෂියෝ සෙන්ටෙනෝ

13

මම භාවිතා කරන විට මගේ පරිගණකයේ:

find . \( -name dirname -type d \) -exec rm -r '{}' ';'

නාමාවලි මකා දැමූ නමුත් මට දෝෂය ඇතිවිය:

find: ‘./dirname’: No such file or directory

එක් එක් නාමාවලිය සඳහා.

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

  1. ./ නාමාවලියෙහි පළමු ප්‍රවේශය සොයා ගැනීම (අවශ්‍ය නොවේ). මෙය උදා: dir.1 /
  2. එය එය 'dir.?' රටාවට සංසන්දනය කරයි. එය ගැලපේද? ඔව්.
  3. "rm -r dir.1" ක්‍රියාත්මක කරන්න.
  4. නාමාවලිය තුළ රටාව සොයා ගැනීමට dir.1 / ඇතුළු කිරීමට උත්සාහ කරන්න. එය exec විධානය ගැන කිසිවක් දන්නේ නැත.
  5. එය තවදුරටත් dir.1 / සොයා නොගනී. ප්‍රතිලාභ ENOENT (ස්ට්‍රේස් ප්‍රතිදානය දෙස බලන්න)

වැඩ කිරීම සඳහා මම මෙය භාවිතා කළෙමි:

rm -r `find . -name dirname -type d`

සොයා ගැනීම තවමත් dirname නම් නාමාවලි වෙත යොමු වීමට උත්සාහ කරන බව මතක තබා ගන්න, එය සැබවින්ම අවශ්‍ය නොවන අතර අමතර කාලයක් ගතවනු ඇත. ඔබගේ නාමාවලි ව්‍යුහය මත පදනම්ව, --depthසොයා ගැනීමේ විකල්පය සමඟ ඔබට මෙය වටා වැඩ කිරීමට හැකි වනු ඇත . ඊට අමතරව, ඔබට dirname / foo / dirname වැනි නාමාවලි ව්‍යුහයක් තිබේ නම් ඔබට rm වෙතින් "එවැනි ගොනුවක් හෝ නාමාවලියක් නොමැත" දෝෂ ලැබෙනු ඇත. දෝෂ මැඩපැවැත්වීම සඳහා ඔබට stderr / dev / null වෙත හරවා යැවීමට හෝ -frm සමඟ (බල) ධජය භාවිතා කළ හැකිය.


2
නරක අදහස: අවකාශයන් සහිත ගොනු නාමය සියලු ආකාරයේ භයානක ගැටළු ඇති කරයි
Clément

2
අනාගත පා readers find . -name "to-delete" -print0 | xargs -r0 -- rm -rකයින් සඳහා : අවකාශය බිඳ වැටෙන්නේ නැති අසාර්ථක ආරක්ෂණ අනුවාදයකි
චාලි

3
ඔබට එකතු කිරීමට අවශ්‍ය unix.stackexchange.com/a/115869/8257 බලන්න -prune.
මාපියෝ

1
-prune"එවැනි ගොනුවක් හෝ නාමාවලියක් නොමැත" දෝෂය වළක්වා ගැනීමට එකතු කරන්න .
ජූලියන් කාර්සික්

12

මෙය කිරීමට වේගවත් ක්‍රමයක් නම්:

find . -name ".svn" -type d -prune -exec rm -rf '{}' '+'

ඔබ වෙනත් ".svn" ඇතුළත ".svn" තිබේ නම්.


උප නාමාවලි සමඟ මැකීමට නාමාවලි සොයා ගැනීමට අවශ්‍ය නම් එය එතරම් ප්‍රයෝජනවත් නොවේ.
ඇලෙක්සිස් විල්කේ

5

විශේෂිත විසඳුම:

shopt -s globstar
rm -r **/.svn
shopt -u globstar #optional. this will disable globstar expansion

3
බොහෝ ලිපිගොනු වලට ගැලපෙන විධාන රේඛා විස්තාරණය සඳහා සටහන, මෙම යාන්ත්‍රණය සමඟ ඔබට ගැලපෙන ගොනු ගණනට සීමාවක් තිබේ. මෙම සීමාව ඉක්මවා යාමේ bash: /bin/rm: Argument list too long
ප්‍රති result ලය

1
Ra ඩ්‍රැව්ස්ලෝන් නිවැරදියි, නමුත් එම සීමාව ලිපිගොනු සිය දහස් ගණනකි. එය මතක තබා ගත යුතු දෙයක්, නමුත් බොහෝ විට එය බොහෝ අයට ගැටලුවක් නොවනු ඇත.
evilsoup

4

-deleteක්‍රියාව -pathපරීක්ෂණය සමඟ හොඳින් ක්‍රියාත්මක වන බව මම සොයා ගතිමි . උදාහරණයක් ලෙස, මුල් පෝස්ටර් ගැටළුව සම්බන්ධයෙන් පහත සඳහන් දෑ ක්‍රියා කළ යුතුය:

find . -path '*/.svn*' -delete

ඔබට විශ්වාසද? -deleteඑයින් ගම්‍ය -depthවන අතර, එය නිසැකවම මගේ පද්ධතියේ හිස් නොවන නාමාවලි මකා දමයි.
මැග්නස්

නැවත පරීක්ෂා කර එය ක්‍රියාත්මක වේ. සමහර විට එය මා විසින් නිවැරදි කරන ලද අක්ෂර වින්‍යාසය විය හැකිය.
kenorb

මම ද මෙම ප්‍රවේශය අත්හදා බැලූ අතර එය ක්‍රියාත්මක විය - නාමාවලි මකා දමන ලදී.
ඇලන්
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.