ගොනු දහස් ගණනක් අඩංගු විශාල නාමාවලිය කාර්යක්ෂමව මකන්න


182

කුඩා ලිපිගොනු සිය දහස් ගණනක් සමඟ ෆෝල්ඩරයක් නොසැලකිලිමත් වීම පිළිබඳව අපට ගැටලුවක් තිබේ.

බොහෝ ලිපිගොනු ඇත, කාර්ය සාධනය rm -rfමඟින් දෝෂයක් ඇති වන අතර ඒ වෙනුවට අප කළ යුත්තේ මෙවැන්නකි:

find /path/to/folder -name "filenamestart*" -type f -exec rm -f {} \;

මෙය ක්‍රියාත්මක වන නමුත් ඉතා මන්දගාමී වන අතර මතකයෙන් ඉවතට යාමෙන් නිරන්තරයෙන් අසමත් වේ.

මෙය කිරීමට වඩා හොඳ ක්‍රමයක් තිබේද? ඉතා මැනවින් මම කැමතියි එහි ඇති අන්තර්ගතය ගැන සැලකිලිමත් නොවී සම්පූර්ණ නාමාවලියම ඉවත් කිරීමට.


20
rm -rf *බොහෝ තර්ක නිසා ෆෝල්ඩරයේ අසමත් විය හැක; කෙසේ වෙතත් rm -rf folder/ඔබට සම්පූර්ණ නාමාවලියම ඉවත් කිරීමට අවශ්‍ය නම් කුමක් කළ යුතුද?
sr_

4
එය අතින් මකා දැමීම වෙනුවට, ෆෝල්ඩරය වෙනම කොටසක තබා යෝජනා කර හුදෙක් && ආකෘතිය && නැවත ගණනය කරන්න.
bbaja42

7
කුතුහලයෙන් යුතුව - බිඳ දැමීමට ලිපිගොනු කීයක් අවශ්‍ය rm -rfවේද?
jw013

7
"ලිපිගොනු දහස් ගණනක් අඩංගු විශාල නාමාවලිය කාර්යක්ෂමව මකා දමන්න" වැනි ප්‍රශ්නය වඩාත් නිවැරදි දෙයකට ඔබ නැවත නම් කළ යුතුය. නාමාවලියක් සහ එහි අන්තර්ගතය මකා දැමීමට , අර්ථ දැක්වීම අනුව පුනරාවර්තනය අවශ්‍ය වේ. ඔබට ඩිරෙක්ටරි ඉනෝඩය අතින්ම ඉවත් කළ හැකිය (බොහෝ විට මූල වරප්‍රසාද අවශ්‍ය වේ), ගොනු පද්ධතිය ඉවත් fsckකර භාවිතයට නොගත් තැටි කොටස් නැවත ලබා ගැනීම සඳහා එය ක්‍රියාත්මක කරන්න , නමුත් එම ප්‍රවේශය අවදානම් සහගත බවක් පෙනෙන්නට ඇති අතර එය වේගවත් නොවනු ඇත. ඊට අමතරව, ගොනු පද්ධති පරීක්ෂාව කෙසේ හෝ නැවත නැවතත් ගොනු පද්ධති ගස හරහා ගමන් කිරීම ඇතුළත් විය හැකිය.
jw013

5
වරක් මා සතුව ccacheගොනු ගසක් විශාල වූ අතර, rmඑතරම් කාලයක් ගත වූ අතර (සහ සමස්ත පද්ධතියම මන්දගාමී විය), අනෙකුත් සියලුම ගොනු ගොනු පද්ධතියෙන් පිටපත් කිරීම, ආකෘතිකරණය කිරීම සහ ඒවා නැවත පිටපත් කිරීම සැලකිය යුතු වේගයකින් සිදු විය. එතැන් සිට මම එවැනි දැවැන්ත කුඩා ගොනු ගස් ඔවුන්ගේම විශේෂිත ගොනු පද්ධතියක් ලබා දෙමි, එබැවින් ඔබට mkfsඒ වෙනුවට කෙලින්ම කළ හැකිය rm.
frostschutz

Answers:


242

Rsync භාවිතා කිරීම පුදුම සහගත වේගවත් හා සරල ය.

mkdir empty_dir
rsync -a --delete empty_dir/    yourdirectory/

rath සරත්ගේ පිළිතුරෙහි තවත් වේගවත් තේරීමක් සඳහන් විය: පර්ල්! එහි මිණුම් සලකුණු වඩා වේගවත් ය rsync -a --delete.

cd yourdirectory
perl -e 'for(<*>){((stat)[9]<(unlink))}'

මුලාශ්‍ර:

  1. /programming/1795370/unix-fast-remove-directory-for-cleaning-up-daily-builds
  2. http://www.slashroot.in/which-is-the-fastest-method-to-delete-files-in-linux

4
ස්තූතියි, ඉතා ප්‍රයෝජනවත්. මම නිතරම rsync භාවිතා කරමි, මේ වගේ මකා දැමීමට ඔබට එය භාවිතා කළ හැකි බව මා දැන සිටියේ නැත. Rm -rf ට වඩා වේගයෙන්
ජෝන් පවෙල්

22
rsyncසරල ඒවාට වඩා වේගවත් විය හැකිය rm, මන්ද එය මකාදැමීම් නිවැරදි පිළිවෙලට සහතික කරයි, එබැවින් අඩු btress නැවත ගණනය කිරීම අවශ්‍ය වේ. මෙම පිළිතුර බලන්න serverfault.com/a/328305/105902
Marki555

9
හැකි ඕනෑම කෙනෙකුට ඇත්තෙන් වෙනසට භාජනය තුළ වන සියලු බහලුම් සහ ගොනු මකා දැමීම perl බසට ලං ප්රකාශනය වෙනස් directory_to_be_deleted ?
අභිනව්

9
සටහන්: එකතු කරන්න -Pද, මෙම කාරක රීති ගැන ප්රවේශම් විය යුතු අතර, තව ප්රදර්ශනය සඳහා rsync කිරීමට විකල්පය, අවර කප්පාදු වේ අනිවාර්ය. අවසාන වශයෙන්, ඔබට පළමු වරට වියළි ධාවනයක්-n දියත් කිරීමේ විකල්පය සමඟ rsync විධානය ආරම්භ කළ හැකිය .
ඩ්‍රැසිල්

2
එම perl විධානය ක්‍රියාත්මක නොවේ
codenamezero

42

ට්විටර් හි යමෙක් -deleteඒ වෙනුවට භාවිතා කිරීමට යෝජනා කළේය-exec rm -f{} \;

මෙය විධානයේ කාර්යක්ෂමතාව වැඩි දියුණු කර ඇති අතර, එය තවමත් සෑම දෙයක්ම හරහා ගමන් කිරීමට පුනරාවර්තනය භාවිතා කරයි.


13
මෙය සම්මත නොවේ. GNU findසතුව ඇත -delete, සහ වෙනත් findසමහර විට.
enzotib

14
-delete-exec rmආරක්ෂාව සහ කාර්යක්ෂමතාව හේතු කොට ගෙන සෑම විටම කැමති විට.
jw013

7
GNU යනු තථ්‍ය ප්‍රමිතියයි.
රොන් ජෝන්

19

වැනි දෙයක් ගැන කුමක් කිව හැකිද: find /path/to/folder -name "filenamestart*" -type f -print0 | xargs -0rn 20 rm -f

පරාමිතිය සඳහා වන තර්කය වෙනස් කිරීමෙන් ඔබට එකවර මකා දැමිය යුතු ගොනු ගණන සීමා කළ හැකිය -n. හිස් තැන් සහිත ගොනු නාමයන් ද ඇතුළත් වේ.


2
-n 20Xargs කෙසේ හෝ පිළිගත හැකි තර්ක-ලැයිස්තු ප්‍රමාණයන්ට සීමා විය යුතු බැවින් ඔබට එය ටිකක් අවශ්‍ය නොවනු ඇත.
වැඩකට නැති

ඔව්, ඔබ හරි. මෙන්න සටහනක් man xargs: (...) max-chars characters per command line (...). The largest allowed value is system-dependent, and is calculated as the argument length limit for exec. එබැවින් -nවිකල්පය වන්නේ xargs හට CLI බෆරයේ ප්‍රමාණය තීරණය කිරීමට නොහැකි වූ විට හෝ ක්‍රියාත්මක කළ විධානයට යම් සීමාවන් තිබේ නම්.
Digital_infinity

16

දක්ෂ උපක්‍රමයක්:

rsync -a --delete empty/ your_folder/

එය සුපිරි CPU තීව්‍ර, නමුත් ඇත්තෙන්ම වේගවත්. Https://web.archive.org/web/20130929001850/http://linuxnote.net/jianingy/en/linux/a-fast-way-to-remove-huge-number-of-files.html බලන්න


එය එතරම් වේගවත් නොවේ, මන්ද එය නාමාවලි අන්තර්ගතය කාර්යක්ෂමව කියවන බැවිනි. 10x වේගවත් විසඳුමක් සහ පැහැදිලි කිරීමක් සඳහා මෙම පිළිතුර බලන්න serverfault.com/a/328305/105902
Marki555

2
@ මාර්කි 555: ප්‍රශ්නය සංස්කරණය කිරීමේදී rsync -a --delete43 ට එදිරිව තත්පර 60 ක් වාර්තා වේ lsdent. අනුපාතය 10x සඳහා වූ time ls -1 | wc -l එදිරිව time ./dentls bigfolder >out.txt(නිසා අර්ධ සාධාරණ හා සසඳන බව > fileඑදිරිව wc -l).
හස්තූර්

ප්රශ්නය වන්නේ මේ NONE අතන විධාන ඇත්තටම කරන්න මැකීම සඳහා අපේක්ෂිත ඉක්මවා යාමක් මෙහෙයුම. ඔවුන් දෙන කේතය? මාකි 555 විසින් විස්තර කර ඇති පරිදි වැඩ නොකරයි.
ස්වර්තාල්ෆ්

14

එක් අදහස් දැක්වීමක් පුළුල් කරමින්, ඔබ කරන්නේ යැයි ඔබ සිතන දේ ඔබ කරන බව මම නොසිතමි.

ඔබේ තත්වය අනුකරණය කිරීම සඳහා පළමුව මම ලිපිගොනු විශාල ප්‍රමාණයක් නිර්මාණය කළෙමි:

$ mkdir foo
$ cd foo/
$ for X in $(seq 1 1000);do touch {1..1000}_$X; done

එවිට මම අසමත් වනු ඇතැයි අපේක්ෂා කළ දේ සහ ඔබ ප්‍රශ්නයේ දී කරන දේ මෙන් උත්සාහ කළෙමි:

$ rm -r foo/*
bash: /bin/rm: Argument list too long

නමුත් මෙය ක්‍රියාත්මක වේ :

$ rm -r foo/
$ ls foo
ls: cannot access foo: No such file or directory

6
වැඩ කළ එකම විසඳුම මෙයයි: rm -Rf bigdirectoryකිහිප වතාවක් ධාවනය කරන්න . මට මිලියන දහස් ගණනක් උප බහලුම් සහ ලිපිගොනු සහිත නාමාවලියක් තිබුණි. මට එම ඩිරෙක්ටරියේ ධාවනය කිරීමට lsහෝ findහෝ rsyncකිරීමට නොහැකි විය, මන්ද එය මතකය නැති වී ගොස් ඇති බැවිනි. විධානය rm -Rfබොහෝ වාරයක් ඉවත්ව ගියේය (මතකයෙන් පිටත) ගොනු බිලියන ගණනක කොටසක් පමණක් මකා දමයි. නමුත් බොහෝ උත්සාහයන් පසු එය අවසානයේදී එම කාර්යය ඉටු කළේය. මතකයෙන් ඉවතට යාම ගැටළුව නම් එකම විසඳුම ලෙස පෙනේ.
erik

10

මට -deleteසාපේක්ෂව පරීක්ෂා කිරීමට අවස්ථාව ලැබුණු අතර -exec rm \{\} \;මට -deleteමෙම ගැටලුවට පිළිතුර විය.

භාවිතා -deleteවඩා 1000 අවම වශයෙන් ගුණයක් වේගවත් ගොනු 400,000 ක ෆෝල්ඩරයේ ගොනු මකා දමන ලදී rm.

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


4
භාවිතා find -execඉටු වන rmඑය එසේ මන්දගාමී වන්නේ ඇයි බව, සෑම ගොනු, ෙවන් ෙවන් වශෙයන් සඳහා විධාන.
මාකි 555

GNU සොයා ගැනීමත් සමඟ, මෙය -exec rm {} \+ප්‍රයෝජනවත් වන්නේ (විශේෂයෙන් \+තැනින් තැන \;), එය අවම පයිප්පයක් සහ දෙබලක ඉහළින් තොරව සාදන ලද xargs මෙන් ක්‍රියා කරයි. අනෙක් විකල්ප වලට වඩා තවමත් මන්දගාමී ය.
dannysauer

ඩැනීසෝවර් execplus1988 දී ඩේවිඩ් කෝර්න් විසින් AT&T හිදී සොයා ගන්නා ලද අතර වසර 25 කට වඩා වැඩි කාලයකට පසුව සහය එකතු කිරීම සඳහා අවසන් වරට ක්‍රියාත්මක කරන ලද්දේ GNU සොයා ගැනීමයි. BTW: ප්‍රමිතිය execplusසහ ප්‍රමිතියෙන් තොර වේගයේ වෙනස -deleteඅවමයි.
schily

ch ෂිලි, එය සිත්ගන්නාසුළුයි, මම කෝර්න්ගේ කෘතියේ විශාල රසිකයෙක්. කෙසේ වෙතත්, අප අදහස් දක්වන පිළිතුරෙන් ඇඟවෙන්නේ ලිනක්ස් හි පරීක්ෂණ සිදු වන බවයි. කාර්යබහුල පෙට්ටිය වැනි අවම අවම ලිනක්ස් ක්‍රියාත්මක කිරීම් වලින් වෙන්කර හඳුනා ගැනීම සඳහා “GNU find” නියම කරන ලදි. :)
dannysauer

5

-deleteඉහත විකල්පය ගැන : මා විසින් නිර්මාණය කරන ලද තාවකාලික ෆෝල්ඩරයක විශාල සංඛ්‍යාවක් (1M + est) ගොනු ඉවත් කිරීමට මම එය භාවිතා කරමි. මම මගේ තැටිය / කොටස අහම්බෙන් පුරවා ඇති අතර, find .විධානය හැර වෙන කිසිවක් ඉවත් කළ නොහැක . එය මන්දගාමී ය, මුලදී මම භාවිතා කළේ:

find . -ls -exec rm {} \;

නමුත් ඒ සඳහා අතිශයින්ම කාලයක් ගත විය. සමහර ලිපිගොනු ඉවත් කිරීම සඳහා මිනිත්තු 15 කට පමණ පසුව එය ආරම්භ වූ නමුත් මගේ අනුමානය නම් එය අවසානයේ ආරම්භ වූ පසු තත්පරයට 10 ක් හෝ ඊට අඩු ප්‍රමාණයක් ඉවත් කිරීමයි. ඉතින්, මම උත්සාහ කළේ:

find . -delete

ඒ වෙනුවට, මම දැන් එය ක්‍රියාත්මක කිරීමට ඉඩ දෙමි. අනෙක් විධානය නොතිබූ CPU මත අතිශයින්ම බදු අය කළද එය වේගයෙන් ක්‍රියාත්මක වන බව පෙනේ. එය දැන් පැයක් වැනි කාලයක් තිස්සේ ක්‍රියාත්මක වන අතර මම සිතන්නේ මගේ ධාවකයට නැවත ඉඩක් ලැබෙනු ඇති අතර කොටස ක්‍රමයෙන් “අඩුවෙමින් පවතී” නමුත් එය තවමත් බොහෝ කාලයක් ගත වේ. එය බරපතල ලෙස සැක කරන්නේ එය අනෙක් ඒවාට වඩා 1,000 ගුණයකින් වේගයෙන් ධාවනය වන බවයි. සෑම දෙයක්ම මෙන්, මට අවශ්‍ය වූයේ අභ්‍යවකාශයට එදිරිව කාලය හා වෙළඳාම පෙන්වා දීමයි. ඔබට CPU කලාප පළල ඉතිරිව තිබේ නම් (අපි කරන්නෙමු) පසුව දෙවැන්න ක්‍රියාත්මක කරන්න. එය මගේ CPU ධාවනය කර ඇත ( uptimeවාර්තා):

10:59:17 up 539 days, 21:21,  3 users,  load average: 22.98, 24.10, 22.87

බර පැටවීමේ සාමාන්‍යය 30.00 ඉක්මවා යන බව මම දැක ඇත්තෙමි, එය කාර්යබහුල පද්ධතියකට හොඳ නැත, නමුත් සාමාන්‍යයෙන් සැහැල්ලුවෙන් පටවා ඇති අපගේ පැය දෙකක කාලයක් සඳහා එය හරි ය. මම පද්ධතියේ වෙනත් බොහෝ දේ පරික්ෂා කර ඇති අතර ඒවා තවමත් ප්‍රතිචාර දක්වයි, එබැවින් අපි දැන් හොඳින් සිටිමු.


1
ඔබ භාවිතා කිරීමට යන්නේ නම් execනිසැකවම භාවිතා කිරීමට අවශ්‍ය නොවන -lsඅතර find . -type f -exec rm '{}' ++ වේගවත් වේ, මන්ද එය එකවර හැසිරවිය හැකි තරම් rm වලට තර්ක ලබා දෙනු ඇත.
xenoterracide

මම හිතන්නේ ඔබ ඉදිරියට ගොස් මෙය තමන්ගේම පිළිතුරකට සංස්කරණය කළ යුතුයි… එය අදහස් දැක්වීමට බොහෝ කාලයක් වැඩියි. එසේම, ඔබේ ගොනු පද්ධතියට තරමක් මිල අධික මකාදැමීම් ඇති බවක් පෙනේ, එය කුතුහලයෙන්ද? ඔබට එය find … -deleteහරහා ධාවනය කළ හැකිය, niceනැතහොත් ioniceඑය උදව් විය හැකිය. එබැවින් සමහර සවිකිරීමේ විකල්පයන් අඩු-බිඳ වැටීම්-ආරක්ෂිත සැකසුම් වලට වෙනස් කළ හැකිය. (ඇත්ත වශයෙන්ම, ගොනු පද්ධතියේ ඇති දේ මත පදනම්ව, සියල්ල මකා දැමීමේ ඉක්මන්ම ක්‍රමය බොහෝ විට mkfsවේ.)
derobert

3
පැටවීමේ සාමාන්‍යය සැමවිටම CPU නොවේ, එය කාලයත් සමඟ අවහිර කළ ක්‍රියාවලි ගණන මැනීමකි. ක්‍රියාවලි තැටියේ I / O අවහිර කළ හැකිය, මෙහි සිදුවන්නේ එයයි.
ලකුණු_අන්ඩර්

බර පැටවීමේ සාමාන්‍යය තාර්කික CPU ගණනට ගණන් නොගන්නා බව සලකන්න. එබැවින් 1තනි-මධ්‍ය යන්ත්‍ර සඳහා loadavg 6464-core පද්ධතියේ loadavg හා සමාන වේ - එයින් අදහස් වන්නේ සෑම CPU එකක්ම 100% ක් කාර්යබහුල බවයි.
මාකි 555

4

ලිනක්ස් හි ගොනු විශාල සංඛ්‍යාවක් මකා දැමීමට භාවිතා කළ හැකි ක්‍රම කිහිපයක් තිබේ. ක්‍රියාත්මක කිරීමේ විකල්පයට වඩා වේගවත් වන සොයාගැනීම් සමඟ මකාදැමීමේ විකල්පය ඔබට භාවිතා කළ හැකිය. එවිට ඔබට perl unlink භාවිතා කළ හැකිය, පසුව rsync පවා. ලිනක්ස් හි ගොනු විශාල ප්‍රමාණයක් මකා දැමිය හැකි ආකාරය


4

Btrfs පරිමාව භාවිතා කිරීම සලකා බලා ගොනු විශාල සංඛ්‍යාවක් ඇති එවැනි නාමාවලියක් සඳහා සම්පූර්ණ පරිමාව මකා දමන්න.

විකල්පයක් ලෙස ඔබට එෆ්එස් පිංතූර ගොනුවක් සාදා එහි ගොනුව ඉවත් කර මකා දැමිය හැකිය.


4

rm -rf directoryවෙනුවට භාවිතා කරන්න rm -rf *.

අපි මුලින් කළේ rm -rf *ඩිරෙක්ටරියේ සිටියදී අන්තර්ගතය ඉවත් කිරීම සඳහා වන අතර එය ලබා ගත හැකි තරම් වේගවත් යැයි සිතුවෙමු. නමුත් අපගේ ජ්‍යෙෂ් senior ඉංජිනේරුවරයෙකු යෝජනා කළේ තරු ලකුණු ( *) භාවිතා කිරීමෙන් වළකින්න , ඒ වෙනුවට මව් නාමාවලිය තුළට යන්න rm -rf directory.

එය වෙනසක් නොකරන්නේ කෙසේද යන්න පිළිබඳ දැඩි විවාදයකින් පසුව, අපි එය භාවිතා කිරීමේ තුන්වන ක්‍රමය සමඟ මිණුම් සලකුණු කිරීමට තීරණය කළෙමු find. ප්‍රති results ල මෙන්න:

time rm -rf *                   2m17.32s
time rm -rf directory           0m15.60s
time find directory -delete     0m16.97s

rm -rf directoryවඩා වේගවත් වේලාවන් 9 ක් පමණ වේ rm -rf *!

අපි ඒ ඉංජිනේරුවාට බියර් එකක් මිල දී ගත් බව අමුතුවෙන් කිව යුතු නැත !

දැන් අපි rm -rf directory; mkdir directoryඩිරෙක්ටරිය මකා දමා එය නැවත නිර්මාණය කිරීමට භාවිතා කරමු.


ගැටළුව වන්නේ * ෂෙල් ප්‍රසාරණයක් සිදු කිරීමයි, එයින් අදහස් වන්නේ: (අ) එය සම්පූර්ණ නාමාවලියම කියවන අතර, (ආ) සොයා ගැනීම ක්‍රියාත්මක කිරීමට පෙර පවා සියලු ගොනු නාම වර්ග කරයි. Ls -1 -U භාවිතා කිරීමෙන් නාමාවලිය අනුක්‍රමිකව කියවනු ලැබේ. ඔබට -n 10000 වෙත ගොස් xargs rm වෙත යැවීමට ලැයිස්තුවක් ලබා ගත හැකිය. එම නම් සියල්ලම නාමාවලියෙහි පළමු කොටසේ ඇති අනුක්‍රමික බැවින් ඒවා ද කාර්යක්ෂමව මකා දමනු ලැබේ. ලිපිගොනු කිසිවක් ඉතිරි නොවන තෙක් එය ලූපයකට දමන්න, එය හොඳින් ක්‍රියාත්මක වේ.
පෝල්_පෙඩන්ට්

තර්කානුකූලව ස්තූතියි @Paul_Pedant!
ජෝෂුවා පින්ටර්

2

GNU parallelස්ථාපනය කර ඇතැයි උපකල්පනය කරමින් , මම මෙය භාවිතා කර ඇත:

parallel rm -rf dir/{} ::: `ls -f dir/`

එය වේගවත් විය.


1

මෙම වෙබ් අඩවියෙන් මම ඉගෙන ගත් පරිදි ඇත්ත වශයෙන්ම විශාල නාමාවලි මකා දැමීමට වෙනස් ප්‍රවේශයක් අවශ්‍ය වේ - ඔබ අයනීස් භාවිතා කළ යුතුය. (-C3 සමඟ) මකාදැමීම් සිදු කරනු ලබන්නේ පද්ධතියට IO-time ඇති විට පමණක් බව සහතික කරයි. ඔබේ පද්ධති පැටවීම ඉහළ මට්ටමකට නොපැමිණෙන අතර සෑම දෙයක්ම ප්‍රතිචාරාත්මකව පවතී (සොයා ගැනීම සඳහා මගේ CPU කාලය 50% ක් තරම් ඉහළ මට්ටමක පැවතුනද).

find <dir> -type f -exec ionice -c3 rm {} \;

6
+ඒ වෙනුවට භාවිතා \;කිරීමෙන් මෙය වේගවත් වනු ඇත, එය එකවර rm වෙත වැඩි තර්ක විතර්ක කරයි, අඩු
දෙබලක

1
ඇයි නැත්තේ ionice -c3 find <dir> -type f -delete
jtgd

1

ඔබ සතුව මිලියන ගණනක් ලිපිගොනු තිබේ නම් සහ ඉහත සෑම විසඳුමක්ම ඔබේ පද්ධතිය ආතතියට පත් කරන්නේ නම් ඔබට මෙම ආනුභාවය උත්සාහ කළ හැකිය:

ගොනුව nice_delete:

#!/bin/bash

MAX_LOAD=3
FILES=("$@")
BATCH=100

while [ ${#FILES[@]} -gt 0 ]; do
    DEL=("${FILES[@]:0:$BATCH}")
    ionice -c3 rm "${DEL[@]}"
    echo -n "#"
    FILES=("${FILES[@]:$BATCH}")
    while [[ $(cat /proc/loadavg | awk '{print int($1)}') -gt $MAX_LOAD ]]; do
        echo -n "."
        sleep 1
    done
done

දැන් ගොනු මකන්න:

find /path/to/folder -type f -exec ./nice_delete {} \+

සොයා ගැනීම මඟින් getconf ARG_MAXදස දහස් ගණනක් ලිපිගොනු (බලන්න ) නිර්මාණය කර එය වෙත යවනු nice_deleteඇත. අධික බරක් අනාවරණය වූ විට නිදා ගැනීමට ඉඩ දීම සඳහා මෙය ඊටත් වඩා කුඩා කණ්ඩායම් නිර්මාණය කරයි.


0
ls -1 | xargs rm -rf 

ප්‍රධාන ෆෝල්ඩරය තුළ ක්‍රියා කළ යුතුය


1
lsෆෝල්ඩරයේ ඇති ගොනු ප්‍රමාණය නිසා ක්‍රියා නොකරනු ඇත. මේ නිසා මට භාවිතා කිරීමට සිදුවිය find, ස්තූතියි.
ටෝබි

4
Ob ටෝබි: උත්සාහ කිරීම ls -f, වර්ග කිරීම අක්‍රීය කරයි. වර්ග කිරීම සඳහා සම්පූර්ණ නාමාවලියම මතකයේ පැටවීම අවශ්‍ය වේ. වර්ගීකරණය නොකළ lsකෙනෙකුට එහි ප්‍රතිදානය ප්‍රවාහනය කළ හැකිය.
camh

1
නව රේඛා අඩංගු ගොනු නාම මත ක්‍රියා නොකරයි.
maxschlepzig

amcamh ඒක ඇත්ත. නමුත් වර්ග කළ අනුපිළිවෙලින් ලිපිගොනු ඉවත් කිරීම වර්ගීකරණය නොකළ ඒවාට වඩා වේගවත් වේ (එක් එක් මකාදැමීමෙන් පසු නාමාවලියෙහි btree නැවත ගණනය කිරීම නිසා). උදාහරණයක් ලෙස මෙම පිළිතුර බලන්න serverfault.com/a/328305/105902
Marki555

ඔබට භාවිතා කළ හැකි එවැනි ගොනු සඳහා @maxschlepzig find . -print0 | xargs -0 rm, එය NULL වර්‍ගය ගොනු නාම බෙදුම්කරු ලෙස භාවිතා කරයි.
මාකි 555

0

ඉහත ඉස්කාටාගේ ඉඟිය සඳහා:

නමුත් මෙය ක්‍රියාත්මක වේ :

$ rm -r foo/
$ ls foo
ls: cannot access foo: No such file or directory

මෙය බොහෝ දුරට ක්‍රියාත්මක විය - නැතහොත් වැඩ කිරීමට ඉඩ තිබුණි - නමුත් මට අවසර දී යම් ගැටලු ඇති විය; ලිපිගොනු සේවාදායකයක තිබුනද මෙම අවසර පත්‍රය පැමිණියේ කොහෙන්දැයි මට තවමත් වැටහෙන්නේ නැත. කෙසේ වෙතත්, ටර්මිනලය සෑම ගොනුවකම තහවුරු කිරීමක් ඉල්ලා සිටියේය. ලිපිගොනු ප්‍රමාණය 20 000 ක් පමණ විය, එබැවින් මෙය විකල්පයක් නොවීය. "-R" පසු මම "-f" විකල්පය එකතු කළෙමි, එබැවින් මුළු විධානයම " rm -r -f foldername / " විය. එවිට එය හොඳින් ක්‍රියාත්මක වන බවක් පෙනෙන්නට තිබුණි. මම ටර්මිනල් සමඟ නවකයෙක්, නමුත් මම හිතන්නේ මේක හරි, හරිද? ස්තූතියි!


0

ඔබට එම ලිපිගොනු ඉවත් කිරීමට අවශ්‍ය වන්නේ කෙසේද යන්න මත පදනම්ව, මම යෝජනා කරන්නේ භාවිතා කිරීමට ය shred.

$ shred -zuv folder

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

mv folder folder_del
mkdir folder
rm -rf folder_del

එක් ඉනෝඩයක් පමණක් වෙනස් කළ යුතු බැවින් මෙය වේගවත්, විශ්වාස කරන්න හෝ නොවන්න. මතක තබා ගන්න: ඔබට මෙම රසය බහු පරිගණක පරිගණකයකින් සමාන්තරගත කළ නොහැක. එය තැටි ප්‍රවේශයට පහළට පැමිණේ, එය RAID මගින් සීමා කර ඇත හෝ ඔබ සතුව ඇත්තේ කුමක්ද.


1
shred බොහෝ නවීන ගොනු පද්ධති සමඟ ක්‍රියා නොකරනු ඇත .

0

ඔබට හැකි ඉක්මනින් බොහෝ ලිපිගොනු ඉවත් කිරීමට අවශ්‍ය නම් ls -f1 /path/to/folder/with/many/files/ | xargs rmඑය හොඳින් ක්‍රියාත්මක විය හැකි නමුත් නිෂ්පාදන පද්ධති මත එය ක්‍රියාත්මක නොකරන්න, මන්ද ඔබේ පද්ධතිය IO ගැටළු බවට පත්විය හැකි අතර මකාදැමීමේ ක්‍රියාවලියේදී යෙදුම් හිර වී ඇති බැවිනි.

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

#!/bin/bash

# Path to folder with many files
FOLDER="/path/to/folder/with/many/files"

# Temporary file to store file names
FILE_FILENAMES="/tmp/filenames"

if [ -z "$FOLDER" ]; then
    echo "Prevented you from deleting everything! Correct your FOLDER variable!"
    exit 1
fi

while true; do
    FILES=$(ls -f1 $FOLDER | wc -l)
    if [ "$FILES" -gt 10000 ]; then
        printf "[%s] %s files found. going on with removing\n" "$(date)" "$FILES"
        # Create new list of files
        ls -f1 $FOLDER | head -n 5002 | tail -n 5000 > "$FILE_FILENAMES"

        if [ -s $FILE_FILENAMES ]; then
            while read FILE; do
                rm "$FOLDER/$FILE"
                sleep 0.005
            done < "$FILE_FILENAMES"
        fi
    else
        printf "[%s] script has finished, almost all files have been deleted" "$(date)"
        break
    fi
    sleep 5
done

0

භාවිතය ls -f | xargs -n 5000 rm, නල් අතර -nඔබේ පද්ධතිය සඳහා (@digital_infinity කිරීමට සුවිශේෂී සම්මානය සඳහා සුදුසු ලෙස සඳහා කණ්ඩායම ප්රමාණය -nතොරතුරක්).

මීට අමතරව, ඔබට පේළිගත කිරීම පේළිගත කළ හැකිය ls -f | grep '^156' | xargs -n 5000 rm.

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


0

පයිතන් ස්ක්‍රිප්ට් අපවිත්‍ර යැයි නොසලකා හැරිය යුතුය:

#!/usr/bin/python3

import shutil
path_for_deletion = input( 'path of dir for deletion> ' ) 
print( 'about to remove ' + path_for_deletion + ' ...' )
shutil.rmtree( path_for_deletion, ignore_errors=True )
print( '... done' )

මෙහි විවිධ ක්‍රම පිළිබඳ ප්‍රයෝජනවත් මිණුම් සලකුණු කර ඇති පුද්ගලයාගෙන් මම ඇසුවෙමි ඔහුට මෙය මිණුම් සලකුණු කිරීමට උත්සාහ කළ හැකිදැයි. මගේ අත්හදා බැලීම් වලින් එය ඉතා හොඳ බව පෙනේ.

NB දෝෂ අවම වශයෙන් ඒවා මුද්‍රණය කිරීම සඳහා හැසිරවිය හැකිය ... නමුත් එය ක්‍රියාත්මක කිරීම සරල trash myDirectoryForDeletionහෝ rm -rfv myDirectoryForDeletionපසුව විය හැකිය.

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.