උප ගසක ඇති සියලුම හිස් නාමාවලි ඉවත් කරන්නේ කෙසේද?


160

උප කුලක ඇති සියලුම හිස් නාමාවලි ඉවත් කරන්නේ කෙසේද? මම ඒ වගේ දෙයක් පාවිච්චි කළා

find . -type d -exec rmdir {} 2>/dev/null \;

නමුත් හිස් නාමාවලි පමණක් අඩංගු නාමාවලි ඉවත් කිරීම සඳහා මා කිහිප වතාවක් ධාවනය කළ යුතුය. එපමණක් නොව, එය සිග්වින් යටතේ තරමක් මන්දගාමී ය.


ඉමාක්ස් විසඳුමක් සඳහා emacs.stackexchange.com/q/12190/2264 ද බලන්න .
ෂෝන් ඇල්රෙඩ්

Answers:


239

GNU findවිකල්ප සහ අනාවැකි ඒකාබද්ධ කරමින් , මෙම විධානය මඟින් එම කාර්යය කළ යුතුය:

find . -type d -empty -delete
  • -type d නාමාවලි වලට සීමා වේ
  • -empty හිස් ඒවාට සීමා වේ
  • -delete එක් එක් නාමාවලිය ඉවත් කරයි

ගස කොළ වලින් ඇවිදින්නේ -depthඑය ඇඟවුම් කරන පරිදි නියම කිරීමකින් තොරව ය -delete.


2
-deleteදැනටමත් ඇඟවුම් කර ඇති -depthබැවින් ඔබට එය අතින් නියම කිරීමට අවශ්‍ය නොවේ.
ජමඩග්නි

1
ස්තූතියි, මම ඒක තේරුම් ගත්තේ නැහැ. පිළිතුර යාවත්කාලීන කරන ලදි.
ක්‍රිස්ටෝෆ් ඩ්‍රෙවට්-ඩ්‍රොගුට්

11
-mindepth 1ආරම්භක නාමාවලිය හිස් නම් එය මකා දැමීම වැළැක්වීම සඳහා මම මෙහි එකතු කරමි .
ග්‍රෙග් ඩුබිකි

2
නියමයි, නමුත් මගේ පැරණි සුනොස් සත්කාරක සමාගම් වල ක්‍රියා නොකරයි ...
dokaspar

2
!කවචයට විශේෂ අරුතක් ඇත. ඔබ එයින් ගැලවිය යුතුයි. වැනි දෙයක්: \! -name 'Completed'පෙර -deleteවැඩ කළ යුතුයි. නැතහොත් ඔබ මෙම නාමාවලියෙහි සලකුණු ගොනුවක් දමන්න.
ක්‍රිස්ටෝෆ් ඩ්‍රෙවට්-ඩ්‍රොගුට්

53

ගැඹුරින් කැදැලි සහිත ඩිරෙක්ටරි ලැයිස්තුගත කරන්න.

find . -depth -type d -exec rmdir {} \; 2>/dev/null

(මෙම හරවා යැවීමේ ඇති අදාළ වන බව සටහන findහුදෙක් කිරීමට, සමස්තයක් ලෙස විධානය rmdirසඳහා පමණක් යළි-යොමුකිරීම. rmdirඔබ අතරමැදි ෂෙල් පතා අවශ්ය කියලා ලෙස සැලකිය යුතු පසුබෑමක්, ඇති වනු ඇත.)

සොයා ගැනීම rmdirසඳහා -emptyපුරෝකථනය පසු කිරීමෙන් ඔබට හිස් නොවන නාමාවලි වල ධාවනය කිරීමෙන් වළක්වා ගත හැකිය . GNU විසින් විධානය ක්‍රියාත්මක කිරීමට ආසන්න වන විට නාමාවලිය පරීක්ෂා කරයි, එබැවින් දැන් හිස් කර ඇති නාමාවලි ලබා ගනී.

find . -depth -type d -empty -exec rmdir {} \;

වේගවත් කිරීමට තවත් ක්‍රමයක් වනුයේ rmdirආයාචනා කාණ්ඩගත කිරීමයි. මේ දෙකම මුල් පිටපතට වඩා සැලකිය යුතු වේගයකින්, විශේෂයෙන් සිග්වින් යටතේ විය හැකිය. මම මේ දෙක අතර වැඩි වෙනසක් බලාපොරොත්තු නොවෙමි.

find . -depth -type d -print0 | xargs -0 rmdir 2>/dev/null
find . -depth -type d -exec rmdir {} + 2>/dev/null

කුමන ක්‍රමය වේගවත්ද යන්න ඔබ සතුව ඇති හිස් නොවන නාමාවලි ගණන මත රඳා පවතී. -emptyකණ්ඩායම් ආයාචනා කිරීමේ ක්‍රම සමඟ ඔබට ඒකාබද්ධ කළ නොහැක , මන්ද එවිට හිස් නාමාවලි පමණක් අඩංගු නාමාවලි ඒවා findදෙස බලන විට හිස් නොවේ .

තවත් ක්‍රමයක් වනුයේ බහු මුරපද ධාවනය කිරීමයි. මෙය වේගවත්ද යන්න බොහෝ දේ මත රඳා පවතී, මුළු ඩිරෙක්ටරි ධූරාවලියම findලකුණු අතර තැටි හැඹිලියේ පැවතිය හැකිද යන්න ඇතුළුව .

while [ -n "$(find . -depth -type d -empty -print -exec rmdir {} +)" ]; do :; done

විකල්පයක් ලෙස, zsh භාවිතා කරන්න. මෙම සුදුසුකම් glob F , හිස්-නොවන බහලුම් තරග, එසේ /^Fහිස් බහලුම් තරග. හිස් නාමාවලි පමණක් අඩංගු නාමාවලි එතරම් පහසුවෙන් ගැලපෙන්නේ නැත.

while rmdir **/*(/N^F); do :; done

( rmdirහිස් විධාන රේඛාවක් ලැබුණු විට මෙය අවසන් වේ .)


ඒක තමයි. තත්පර 90 ක් වෙනුවට තත්පර 0.90 ක් ගතවේ.
maaartinus

amaaartinus: මට කුතුහලයක් තිබේ: ඔබට නැතිව උත්සාහ කළ හැකි සමාන දත්ත කට්ටලයක් ඔබ සතුව -pතිබේද? මම හිතුවේ නැහැ ඒකෙන් වෙනසක් වෙයි කියලා.
ගිලෙස්ගේ SO- නපුරු වීම නවත්වන්න '

3
art මාර්ටිනස් - වෙනත් කුඩා ප්‍රශස්තිකරණ: එකතු කිරීම -emptyමේ සමඟ වැඩ කළ යුතුය (එය කොපමණ ප්‍රමාණයක් ලබා ගනීදැයි මට හරියටම විශ්වාස නැත). ඔබ ඉවත් කිරීමට අකමැති බැවින් .භාවිතා කරන්න -mindepth 1.
mattdm

එය ඉවත් කිරීම නොව ක්‍රියාවලිය ඉහළින් ආරම්භ වේ. මම -depthතර්කය නොසලකා rmdir -pහැරියෙමි. මම දැනටමත් මගේ අදහස වෙනස් කර ඇත. 90 s මගේ මුල් උත්සාහය විය; මෙහි පුදුම වීමට දෙයක් නැත.
maaartinus

2
rmdirමෙම විධානය සමඟ අවම වශයෙන් GNU සොයාගැනීමෙන් අපට විධාන ඇමතුම සම්පූර්ණයෙන්ම ඉවත් කළ හැකි බව මම තේරුම් find . -depth -type d -empty -delete
ගතිමි

6

ඔබ පමණක් වියා නම් -p, ඔබේ rmdirඒ එක් සමත් වැඩ කරන්නම්. එය ලස්සන හෝ ප්‍රශස්ත නොවනු ඇත, නමුත් එය සියල්ල ලබා ගත යුතුය. එමඟින් ඔබ ඉවත් කරන හිස් හිස් නොවන මව් නාමාවලි ඉවත් කරන ලෙස rmdir ට කියයි.

-emptyසොයා ගැනීම සඳහා පරීක්ෂණය එකතු කිරීමෙන් ඔබට ටිකක් ඉතිරි කර ගත හැකිය, එබැවින් එය හිස් නොවන නාමාවලි සමඟ කරදර වන්නේ නැත.


3

find . -depth -type d -exec rmdir {} +

යනු මෙම ප්‍රශ්නයට සරලම හා සම්මත අනුකූල පිළිතුරයි.

අවාසනාවකට මෙහි දී ඇති අනෙක් පිළිතුරු සියල්ලම රඳා පවතින්නේ සියලුම පද්ධතිවල නොපවතින විකුණුම්කරුවන්ගේ විශේෂිත වැඩි දියුණු කිරීම් මත ය.


3
මෙම පිළිතුර මකා දැමිය නොහැකි එක් එක් නාමාවලිය සඳහා දෝෂයක් මතු කරයි.
විලෙම් වැන් කෙට්විච්

0

find . -type d -printf "%d %p\n" |\ sort -nr |\ perl -pe 's/^\d+\s//;' |\ while read dir; do \ (rmdir "$dir" > /dev/null 2>&1); \ done

එය ක්‍රියාත්මක වන ආකාරය මෙන්න:

  1. සියළුම ඩිරෙක්ටරි ඒවායේ ගැඹුර සමඟ පුනරාවර්තනය කරන්න
  2. ඒවායේ ගැඹුරේ අනුපිළිවෙලින් වර්ග කරන්න
  3. නාමාවලි මාර්ග පමණක් පෙරහන් කරන්න
  4. rmdirලැයිස්තුවේ එකින් එක ධාවනය කරන්න

0

මම නිතර භාවිතා කරන findවිධානයන් සඳහා මෙම අන්වර්ථයන් භාවිතා කරමි , විශේෂයෙන් මම ඩුපෙගුරු භාවිතයෙන් තැටි අවකාශය පිරිසිදු කරන විට , අනුපිටපත් ඉවත් කිරීමෙන් හිස් නාමාවලි රාශියක් ඇති විය හැකිය.

ඇතුළත අදහස් .bashrcදැක්වීම නිසා මට එය වෙනස් කිරීමට අවශ්‍ය වූ විට ඒවා පසුව අමතක නොවේ.

# find empty directories
alias find-empty='find . -type d -empty'

# fine empty/zero sized files
alias find-zero='find . -type f -empty'

# delete all empty directories!
alias find-empty-delete='find-empty -delete'

# delete empty directories when `-delete` option is not available.
# output null character (instead of newline) as separator. used together
# with `xargs -0`, will handle filenames with spaces and special chars.
alias find-empty-delete2='find-empty -print0 | xargs -0 rmdir -p'

# alternative version using `-exec` with `+`, similar to xargs.
# {}: path of current file
# +: {} is replaced with as many pathnames as possible for each invocation.
alias find-empty-delete3='find-empty -exec rmdir -p {} +'

# for removing zero sized files, we can't de-dupe them automatically
# since they are technically all the same, so they are typically left
# beind. this removes them if needed.
alias  find-zero-delete='find-zero -delete'
alias find-zero-delete2='find-zero -print0 | xargs -0 rm'
alias find-zero-delete3='find-zero -exec rm {} +'

-2

rm -r */විධානය මට පහසුවෙන් ක්‍රියාත්මක විය. ගොනු සහිත නාමාවලි බලහත්කාරයෙන් ඉවත් කිරීමට rmඅවශ්‍ය -fවිය යුතුය . rm -rහිස් නාමාවලි පමණක් ඉවත් කළ යුතුය. මෙය වැරදි විය හැක්කේ මන්දැයි මම විවෘතව සිටිමි. */ෆෝල්ඩර දෙස පමණක් බලන බැවින් මෙයද ගොනු වලින් ඉවත් විය යුතුය .


1
rmමූලික වශයෙන් ලිපිගොනු ඉවත් කිරීමට අදහස් කරන පරිදි එය තරයේ පරීක්ෂා කිරීමට මම තරයේ නිර්දේශ කරමි . අතර */පමණක් බහලුම් තරග, මම එය ගැඹුරු මට්ටම් කරන දේ ගැන කිසිම අදහසක් නෑ. එය සමහර පද්ධතිවල පමණක් ක්‍රියාත්මක වන බව මට සිතාගත හැකිය.
maaartinus
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.