නාමාවලි ශාඛාවක් තුළ ඇති ඇතැම් ලිපිගොනු වල මුළු ප්‍රමාණය සොයා ගන්න


164

පින්තූර ගබඩා නාමාවලියක් ඇතැයි උපකල්පනය කරන්න, කියන්න, ./photos/john_doeඑහි විවිධ උප බහලුම් ඇත, බොහෝ ලිපිගොනු වාසය කරයි (කියන්න, *.jpg). john_doeශාඛාවට පහළින් ඇති එම ලිපිගොනු වල සාරාංශ ප්‍රමාණය ගණනය කරන්නේ කෙසේද ?

මම උත්සාහ කළෙමි du -hs ./photos/john_doe/*/*.jpg, නමුත් මෙය පෙන්වන්නේ තනි ලිපිගොනු පමණි. එසේම, මෙය ලුහුබැඳ යන්නේ john_doeනාමාවලියෙහි පළමු කැදැල්ල මට්ටම පමණි john_doe/june/, නමුත් මඟ හැරේ john_doe/june/outrageous/.

ඉතින්, සමහර ලිපිගොනු වල ප්‍රමාණය සාරාංශ කොට, සමස්ත ශාඛාව හරහා ගමන් කරන්නේ කෙසේද?

Answers:


212
find ./photos/john_doe -type f -name '*.jpg' -exec du -ch {} + | grep total$

duගොනු ලැයිස්තුව ඉතා දිගු බැවින් එක් අයෙකුට වඩා වැඩි ගණනක් අවශ්‍ය නම්, බහුවිධ එකතුව වාර්තා වන අතර ඒවා සාරාංශගත කළ යුතුය.


8
find -iname 'file *' -exec du -cb {} + | grep එකතුව $ | cut -f1 | paste -sd + - | bc # සාරාංශගත බයිට් ප්‍රමාණය
මයිකල් halizmazia

3
ඔබේ පද්ධතිය වෙනත් භාෂාවක් යටතේ ක්‍රියාත්මක වන්නේ නම්, ඔබ පෝලන්ත භාෂාවෙන් මුළු raz රාසෙම් වැනි වෙනත් වචනයකට වෙනස් කළ යුතුය.
Zbyszek

1
මේ LC_ALL=POSIXආකාරයට සැමවිටම grep කිරීමට ඔබට උපසර්ගයක් ලෙස එකතු කළ හැකිය :LC_ALL=POSIX find ./photos/john_doe -type f -name '*.jpg' -exec du -ch {} + | grep total$
Sven

2
ඔබ භාවිතා නොකරන්නේ -nameනම්, grep වෙත වෙනස් කරන්න, grep -P "\ttotal$"නැතිනම් එය "සම්පුර්ණ" වලින් අවසන් වන සියලුම ගොනු අල්ලා ගනු ඇත.
thdoan

3
@ මයිකල්ස්මාසියා සමහර ෂෙල් වෙඩි (උදා: වින්ඩෝස් සඳහා Git Bash) එන්නේ නැත bc, එබැවින් මෙන්න වඩා අතේ ගෙන යා හැකි විසඳුමක්:find -name '*.jpg' -type f -exec du -bc {} + | grep total$ | cut -f1 | awk '{ total += $1 }; END { print total }'
thdoan

56
du -ch public_html/images/*.jpg | grep total
20M total

.jpgමෙම නාමාවලියෙහි ඇති මගේ ලිපිගොනු වල සම්පූර්ණ භාවිතය මට ලබා දෙයි .

බහුවිධ නාමාවලි සමඟ කටයුතු කිරීමට ඔබට මෙය findකෙසේ හෝ ඒකාබද්ධ කළ යුතුය.

ඔබට ඩු විධාන උදාහරණ ප්‍රයෝජනවත් විය හැකිය (එයට ද ඇතුළත් වේ find)


3
මෙය යටින් පවතින නාමාවලි හරහා ගමන් කරන්නේ නැද්ද?
mbaitoff

1
පිළිගත් විසඳුමට වඩා මෙය ටයිප් කිරීම පහසුය, නමුත් එය හරි-අඩක් පමණි, එය උප බහලුම්වල පින්තූර ඇතුළත් නොකරයි. සියලුම ලිපිගොනු එක නාමාවලියක තිබේදැයි දැන ගැනීම සතුටක්.
gbmhunter

@gbmhunter මම හිතන්නේ ඔබ -R පරාමිතිය -ch ට එකතු කළහොත් ඔබට උප බහලුම් ද ලැබෙනු ඇත. තහවුරු කිරීමට වුවද එය අත්හදා බැලීමට මම දැනට පරිගණකයක නොමැත.
ලෙවොන්

1
මට man7.org/linux/man-pages/man1/du.1.html-R හි විකල්පයක් නොපෙනේ . මෙම අවස්ථාවේ දී පුනරාවර්තන විකල්පයක් උපකාරී වනු ඇතැයි මම නොසිතමි, මන්ද යත්, තර්ක විතර්ක කිරීමට පෙර කවචය ගෝලීය ව්‍යාප්තිය සිදු කරන බැවිනි du.
gbmhunter

උප බහලුම් වල පින්තූර ලබා ගැනීමට, ඔබට භාවිතා කළ **/*.jpgනොහැකිද?
කයිල් බැරන්

25

මූලික වශයෙන්, ඔබට කරුණු දෙකක් අවශ්‍යයි:

du -ch -- **/*.jpg | tail -n 1

ඉතා හොඳ පිළිතුරක්. සොයා ගැනීම භාවිතා කිරීමට වඩා සරලයි (ඩිරෙක්ටරි ව්‍යුහයට ගැලපෙන තාක් * හෝ **)
ඇන්ඩ්‍රේ ඩි මිරැන්ඩා

ගොනු වල ඉතා දිගු ලැයිස්තු හැසිරවීමට ද එයට හැකි අතර භාවිතා findකිරීමෙන් වැරදි ප්‍රති .ල ලබා ගත හැකිය.
එරික් ෆෝර්නි

bash brace ප්‍රසාරණය මඟින් ආදේශක කාඩ්පත් සමූහයක් ද මැනීමට ඉඩ ලබා දේ. du -ch -- ./{dir1,dir2}/*.jpgහෝdu -ch -- ./{prefix1*,prefix2*}.jpg
ජේ.මෝනි

1
RicEricFournie කෙසේ වෙතත් 300k Argument list too longපෙළ ලිපිගොනු සැකසීමේදී මට දෝෂයක් ඇතිවිය.
xtluo

විධානයක් සඳහා උපරිම තර්ක ගණන (මේ අවස්ථාවේ දී, ආදේශක කාඩ්පත් ප්‍රසාරණය මඟින් ආපසු ලබා දුන් ගොනු නම්) පරීක්ෂා කළ හැකිය getconf ARG_MAX. ඔබට තවත් තිබේ නම්, ඔබට ගොනු එකින් එක සැකසීමට අවශ්‍ය වේ.
එරික් ෆෝර්නි

19

අවසාන පිළිතුර නම්:

{ find <DIR> -type f -name "*.<EXT>" -printf "%s+"; echo 0; } | bc

සහ ඊටත් වඩා වේගවත් අනුවාදය, RAM මගින් සීමා නොකෙරේ, නමුත් එයට GnU AWK අවශ්‍ය වන්නේ බිග්නම් සහායෙනි:

find <DIR> -type f -name "*.<EXT>" -printf "%s\n" | gawk -M '{t+=$1}END{print t}'

මෙම අනුවාදයේ පහත ලක්ෂණ ඇත:

  • findඔබ සොයන ලිපිගොනු නියම කිරීමේ සියලු හැකියාවන්
  • මිලියන ගණනක් ගොනු සඳහා සහය දක්වයි
    • මෙහි ඇති වෙනත් පිළිතුරු තර්ක ලැයිස්තුවේ උපරිම දිග අනුව සීමා වේ
  • අවම නල මාර්ගයක් සහිත සරල ක්‍රියාවලි 3 ක් පමණි
    • මෙහි බොහෝ පිළිතුරු C + N ක්‍රියාවලීන් ඇති කරයි, එහිදී C යනු නියත වන අතර N යනු ගොනු ගණන වේ
  • නූල් හැසිරවීම ගැන කරදර වන්නේ නැත
    • මෙම අනුවාදය කිසිදු අතුගා දැමීමක් හෝ නැවත සකස් කිරීමක් නොකරයි
    • හොඳයි, findගොනු නාමවල සරල ආදේශක කාඩ් ගැලපීමක් කරයි
  • විකල්ප වශයෙන් මානව කියවිය හැකි ස්වරූපෙයන් බවට මුදලක් ආකෘති (උදා. 5.5K, 176.7M, ...)
    • එය එකතු කිරීමට | numfmt --to=si

මෙම පිළිතුරේ සරලත්වයට මම කැමතියි, නමුත් එය මට වැඩ කළේ ආරම්භක වරහනෙන් පසුව සහ අවසන් වරහනට පෙර අවකාශයන් හඳුන්වා දුන් විට පමණි. එය ඇත්ත වශයෙන්ම 'අනන්ත' ලිපිගොනු ගණනකට සහය දක්වනු ඇත්දැයි මම කල්පනා කරමි :)
andyb

1
@andyb ප්‍රතිපෝෂණයට ස්තූතියි, වරහන් වටා ඇති අවකාශය සැබවින්ම BASH හි අවශ්‍ය වේ, මම ZSH භාවිතා කරමි, එබැවින් මම එය නොදැන සිටියෙමි. සංඛ්‍යා ගලා යන විට bc හි මතක භාවිතය සෙමෙන් වර්ධනය වන බැවින් ඔබේ පද්ධතියේ ඇති RAM මඟින් ගොනු ගණන සීමා වේ.
rindeal

10

මේ දක්වා ලබා දී ඇති පිළිතුරු, සොයාගැනීමේ සිට ඩු ​​දක්වා සම්මත කරන ලද ගොනු ලැයිස්තුව මෙතරම් දීර් be විය හැකි බැවින්, සොයා ගැනීම ස්වයංක්‍රීයව ලැයිස්තුව කැබලිවලට බෙදී යයි total.

ඔබට grep total(පෙදෙසි!) අතින් එකතු කළ හැකිය, නැතහොත් වෙනත් විධානයක් භාවිතා කළ හැකිය. සොයාගැනීමෙන් සොයාගත් සියලුම ලිපිගොනු වලින් විශාල ප්‍රමාණයක් (කිලෝබයිට් වලින්) ලබා ගැනීමට ඇත්තේ ක්‍රම දෙකක් පමණි:
find . -type f -iname '*.jpg' -print0 | xargs -r0 du -a| awk '{sum+=$1} END {print sum}'

පැහැදිලි කිරීම
find . -type f -iname '*.jpg' -print0: නඩුව නොසලකා jpg දිගුව සහිත සියලුම ලිපිගොනු සොයාගෙන (එනම් * .jpg, * .JPG, * .Jpg ...) ඒවා ප්‍රතිදානය කරන්න (ශුන්‍ය-අවසන්).
xargs -r0 du -a: -r: කිසිදු තර්කයක් සම්මත නොවී පවා Xargs විධානය අමතනු ඇත, එය -r වළක්වයි. -0 යන්නෙන් අදහස් කරන්නේ ශුන්‍ය-අවසන් කළ නූල් (නව රේඛාව අවසන් නොවේ).
awk '{sum+=$1} END {print sum}': පෙර විධානය මඟින් ගොනු ප්‍රමාණයේ ප්‍රතිදානය සාරාංශ කරන්න

යොමු කිරීම සඳහා, අනෙක් මාර්ගය වනු ඇත
find . -type f -iname '*.jpg' -print0 | du -c --files0-from=-


අමතර ඉඟියක්: මගේ HDD හි ලිපිගොනු 23428 ක් (රූප 22323) පළමු ක්‍රමය තත්පර 1 ක් ධාවනය වන අතර දෙවැන්න තත්පර 3.8 ක් ධාවනය කරයි.
ජනවාරි

දෙදෙනාම GNU පද්ධතියක් උපකල්පනය කරන බව සලකන්න. පළමුවැන්න උපකල්පනය කරන්නේ ගොනු නාමවල නව රේඛා අක්ෂර අඩංගු නොවන බවයි.
ස්ටෙෆාන් චසෙලාස්

du --file0-fromඔබ එය පළමුවෙන් ධාවනය කළ නිසා (හැඹිලි ආචරණය) වැඩි කාලයක් ගතවනු ඇතැයි මම සිතමි .
ස්ටෙෆාන් චසෙලාස්

1
සමඟ xargs, කිහිපයක් du -aධාවනය කළ හැකිය, එබැවින් දෘඩ සබැඳි තිබේ නම් ඔබට විෂමතා තිබිය හැකිය.
ස්ටෙෆාන් චසෙලාස්

4

ලිපිගොනු ලැයිස්තුව ඉතා විශාල නම් එය du -cGNU පද්ධතියක තනි ආයාචනයක් වෙත යැවිය නොහැක , ඔබට මෙය කළ හැකිය:

find . -iname '*.jpg' -type f -printf '%b\t%D:%i\n' |
  sort -u | cut -f1 | paste -sd+ - | bc

(ප්‍රමාණය බයිට් කුට්ටි 512 කින් ප්‍රකාශ වේ). වැනි duඑය එක් වරක් පමණක් වෙහෙස මහන්සි වී සබැඳි ගණන් කිරීමට උත්සාහ කරයි. ඔබ දෘඩ සබැඳි ගැන තැකීමක් නොකරන්නේ නම්, ඔබට එය සරල කළ හැකිය:

(printf 0; find . -iname '*.jpg' -type f -printf +%b) | bc

තැටි භාවිතය වෙනුවට ඔබට ප්‍රමාණය අවශ්‍ය නම්, ආදේශ %bකරන්න %s. ප්‍රමාණය පසුව බයිට් වලින් ප්‍රකාශ වේ.


-bash: bc: command not foundCentos - Linux 2.6.32-431.el6.x86_64
yeya

yyeya, ඔබේ CentOS යෙදවීම කැඩී ඇති බවක් පෙනේ. bcවිකල්ප නොවන POSIX විධානයකි.
ස්ටෙෆාන් චසෙලාස්

2

මෙතෙක් සඳහන් කර ඇති විසඳුම් අකාර්යක්ෂමයි (ක්‍රියාත්මක කිරීම මිල අධිකයි) සහ ගොනු ලැයිස්තුව දිගු නම් හෝ ඒවා මැක් ඕඑස් එක්ස් මත ක්‍රියා නොකරන්නේ නම් එකතු කිරීම සඳහා අමතර අත්පොතක් අවශ්‍ය වේ. පහත විසඳුම ඉතා වේගවත්ය, ඕනෑම පද්ධතියක වැඩ කළ යුතු අතර, සම්පූර්ණ පිළිතුර GB වලින් ලබා දෙයි (MB හි එකතුව බැලීමට ඔබට අවශ්‍ය නම් / 1024 ඉවත් කරන්න): find . -iname "*.jpg" -ls |perl -lane '$t += $F[6]; print $t/1024/1024/1024 . " GB"'


වත් -inameහෝ -lsනොවන බවත්, එය එසේ සම්මත / අතේ ගෙන යා හැකි වේ ඕනෑම පද්ධතිය මත වැඩ එක්කෝ. නව රේඛා අක්ෂර අඩංගු ගොනු නාම හෝ සිම්ලින්ක් ඉලක්ක තිබේ නම් එය නිසි ලෙස ක්‍රියා නොකරනු ඇත.
ස්ටෙෆාන් චසෙලාස්

එය ලබා දෙන්නේ ඒවායේ තැටි භාවිතය නොව ගොනු ප්‍රමාණයන්ය. සිම්ලින්ක් සඳහා, එය සිම්ලින්ක් වල ප්‍රමාණය ලබා දෙයි, නමුත් ඔවුන් පෙන්වා දෙන ලිපිගොනු නොවේ.
ස්ටෙෆාන් චසෙලාස්

2

Zbyszek සිය අදහස් දැක්වීමේදී දැනටමත් පෙන්වා දී ඇති පරිදි, ඕනෑම පෙදෙසක් සමඟ වැඩ කිරීමට SHW ගේ විශිෂ්ට පිළිතුර වැඩි දියුණු කිරීම:

LC_ALL=C find ./photos/john_doe -type f -name '*.jpg' -exec du -ch {} + | grep total$

2

du ස්වාභාවිකවම නාමාවලි ධූරාවලිය හරහා ගමන් කරන අතර awk හට පෙරීම සිදු කළ හැකි බැවින් මෙවැනි දෙයක් ප්‍රමාණවත් විය හැකිය:

du -ak | awk 'BEGIN {sum=0} /\.jpg$/ {sum+=$1} END {print sum}'

මෙය GNU නොමැතිව ක්‍රියා කරයි.


1
statසෙවූ රටාවට අනුරූප නොවන ලිපිගොනු සඳහා ඇමතුමක් ලැබෙන බැවින් මෙය වඩා මිල අධිකය .
නීතිය 29

මෙම විසඳුම පමණක් මගේ මැක් මත ක්‍රියාත්මක වේ.
මතියස් එම්

1
එය උපකල්පනය කරන්නේ ගොනු නාමවල නව රේඛා අක්ෂර අඩංගු නොවන බවත් නම අවසන් වන නාමාවලියක් නොමැති බවත් ය .jpg.
ස්ටෙෆාන් චසෙලාස්

0

තවත් එකක් වනු ඇත

ls -al <directory> | awk '{t+=$5}END{print t}}'

ඔබ තනි නාමාවලියකින් බලනවා යැයි සිතමු. ඔබට වත්මන් නාමාවලිය දෙස බැලීමට අවශ්‍ය නම් සහ ඊට යටින්

ls -Ral <directory> | awk '{t+=$5}END{print t}}'

(1) විශාලතම ගැටළුව: මෙය සෑම දෙයක්ම දෙස බලයි , නමුත් ප්‍රශ්නය විශේෂයෙන් සෙවුම් ලිපිගොනු උප කාණ්ඩයකට සීමා කිරීම ගැන ය; උදා *.jpg. ,  . මෙම ගණන් ඇත, ගැලපෙන නොවන නම් (උදා: ගොනු පමණක් නොව (ඒ ප්රශ්නය පැහැදිලිව විශ්රාම වැටුප් සඳහා ආවර්තනික බහලුම සෝදිසි කිරීමට අවශ්ය බව පවසයි.) (2)  *.gif, *.pngආදිය), පමණක් නොව, නොවන ගොනු; උදා: නාමාවලි සහ සංකේතාත්මක සබැඳි. (3) කිසියම් ගොනු නාමයක (ය) නව රේඛා (ය) අඩංගු නම් මෙය වැරදි ප්‍රති results ල ලබා දිය හැකිය. (4) සමහර (දුප්පත්) පිළිතුරු මෙන්, මෙය ද කිහිප වතාවක්ම දැඩි සම්බන්ධතා ගණන් ගනී. … (ඉදිරියට)
ස්කොට්

(Cont'd) ... ඉඟිය: ප්රශ්නයක් පැරණි පාහේ වසර 8 ක් සහ 9 පිළිතුරු ඇත විට, ඒ සියල්ල යහපත් පිළිතුරු දැනටමත් ලබා දී ඇති බව ඉතා හැකි වන අතර, ඔබ යන්න පිළිබඳ දීර්ඝ කාලයක් පුරා වෙහෙස මහන්සි වී කල්පනා කළ යුතුයි ඇත්තටම අලුත් හා වඩා යහපත් යමක් දායක වීමට.
ස්කොට්


0

ඩු වෙනුවට ස්ටැට් භාවිතා කරන වෙනත් විකල්පයක්

stat -L -c %s ** | awk '{s+=$1} END {printf "%.0f\n", s}'

** භාවිතා කිරීම ගැන ගිලෙස්ගේ පිළිතුර බලන්න

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.