ฉันจะเรียงลำดับผลลัพธ์ du-h ตามขนาดได้อย่างไร


966

ฉันต้องได้รับรายชื่อผลผลิตที่มนุษย์อ่านได้

อย่างไรก็ตามduไม่มีตัวเลือก "เรียงตามขนาด" และการวางท่อเพื่อsortไม่ทำงานกับการตั้งค่าสถานะที่มนุษย์อ่านได้

ตัวอย่างเช่นการทำงาน:

du | sort -n -r 

ส่งออกการใช้งานดิสก์เรียงตามขนาด (มากไปหาน้อย):

du |sort -n -r
65108   .
61508   ./dir3
2056    ./dir4
1032    ./dir1
508     ./dir2

อย่างไรก็ตามการรันด้วยแฟล็กที่มนุษย์สามารถอ่านได้ไม่เรียงลำดับอย่างถูกต้อง:

du -h | sort -n -r

508K    ./dir2
64M     .
61M     ./dir3
2.1M    ./dir4
1.1M    ./dir1

ไม่มีใครรู้วิธีจัดเรียงdu -h ตามขนาดหรือไม่


เฮ้ ... ตลกที่คุณควรถามเพราะมันน่ารำคาญสำหรับฉัน ... อย่างน้อยหนึ่งปี เมื่อสัปดาห์ที่แล้วฉันดาวน์โหลดรหัสไปยัง GNU coreutils (ซึ่งเป็นส่วนหนึ่ง) และดู แต่ตัดสินใจว่าจะใช้เวลาอีกเล็กน้อยกว่าที่ฉันมีในมือของฉันที่จะแก้ไข ... ใคร? :)
คลาย

นี่เป็นคำถามที่เกี่ยวข้องมาก: serverfault.com/q/737537/35034
cregox

คุณเคยเห็นอันนี้ไหม? unix.stackexchange.com/questions/4681/… เป็นสำเนาที่ใกล้เคียงและคุ้มค่ากับทองคำ คุณทำตามปกติduแต่เพิ่ม -h ลงในsortคำสั่ง คุณสามารถเพิ่ม-rhขนาดที่ใหญ่ที่สุดเป็นอันดับแรกในไฟล์ไม่เช่นนั้นคุณจะต้องtailเห็น Space Hogs
SDsolar

ฉันไม่ได้คาดหวังว่าคำถามดังกล่าวจะเป็นที่นิยมมากเมื่อฉัน googled นี้
Mateen Ulhaq

คำตอบ:


1361

GNU coreutils 7.5 ที่วางจำหน่ายในเดือนสิงหาคม 2009 sortอนุญาตให้ใช้-hพารามิเตอร์ซึ่งอนุญาตส่วนต่อท้ายที่เป็นตัวเลขของชนิดที่สร้างโดยdu -h:

du -hs * | sort -h

หากคุณใช้การเรียงลำดับที่ไม่รองรับ-hคุณสามารถติดตั้ง GNU Coreutils เช่นใน Mac OS X รุ่นเก่า:

brew install coreutils
du -hs * | gsort -h

จากsort คู่มือ :

-h, --human-numeric-sort compare human readable numbers (e.g., 2K 1G)


3
ส่วนที่เกี่ยวข้องของคู่มือ: gnu.org/software/coreutils/manual/…
wodow

29
ง่ายต่อการติดตั้งบน OS X ด้วย homebrew - ติดตั้ง coreutils
Richard Poirier

41
สิ่งที่ดี! โดยส่วนตัวฉันมักจะทำdu -BM | sort -nrเพื่อแก้ปัญหา - มันเป็นมนุษย์ที่อ่านได้เพียงพอและมันถูกจัดเรียงถ้าใครก็ตามที่ติดอยู่กับ coreutils รุ่นเก่า
chutz

30
หากใช้บน OSX ผ่าน Homebrew โปรดทราบว่าตอนนี้คุณจะต้องใช้ gsort แทน sort:du -hs * | gsort -h
Brian Cline

2
@PaulDraper du -BMพิมพ์ทุกอย่างเป็นเมกะไบต์ดังนั้นไฟล์ที่ 168K จะแสดงเป็น 0M เว้นแต่จะมีความคลาดเคลื่อนของเวอร์ชั่นอื่นที่ฉันไม่ทราบ เวอร์ชันของฉันduแสดงเฉพาะค่าจำนวนเมกะไบต์
chutz

88
du | sort -nr | cut -f2- | xargs du -hs

48
และมันจะทำการนับซ้ำจำนวนมาก
Douglas Leeder

1
ครั้งแรกมันทำ du ปกติ - แล้วสำหรับแต่ละรายการมันคำนวณขนาดเพียงเพื่อพิมพ์ในรูปแบบที่มนุษย์สามารถอ่านได้
Douglas Leeder

8
@Douglas Leeder: คุณถูกต้องสำหรับการนับซ้ำ แต่คิดว่า du ที่สองไม่ได้เริ่มจาก cold cache (ขอบคุณ OS) @hasen j: xargs เป็นคำสั่งที่มีประโยชน์มากมันแยก stdin และดึงข้อมูลเป็นอาร์กิวเมนต์ คำสั่งที่กำหนด
cadrian

4
จริง ๆ แล้วคริสนั้นเหนือกว่าเพราะมันทำงานกับเส้นทางที่มีช่องว่าง โยนคะแนนของคุณเป็นเพื่อนสนิท
rbright

3
น่าเกลียด แต่ข้ามแพลตฟอร์ม :)
voretaq7

62

@ ดักลาส Leeder คำตอบอีกหนึ่งคำตอบ: เรียงลำดับเอาต์พุตที่มนุษย์สามารถอ่านได้จาก du -h โดยใช้เครื่องมืออื่น ชอบ Perl!

du -h | perl -e 'sub h{%h=(K=>10,M=>20,G=>30);($n,$u)=shift=~/([0-9.]+)(\D)/;
return $n*2**$h{$u}}print sort{h($b)<=>h($a)}<>;'

แบ่งออกเป็นสองบรรทัดเพื่อให้พอดีกับจอแสดงผล คุณสามารถใช้วิธีนี้หรือทำให้เป็นหนึ่งซับมันจะทำงานอย่างใดอย่างหนึ่ง

เอาท์พุท:

4.5M    .
3.7M    ./colors
372K    ./plugin
128K    ./autoload
100K    ./doc
100K    ./syntax

แก้ไข:หลังจากไม่กี่รอบของกอล์ฟที่PerlMonksผลสุดท้ายคือต่อไปนี้:

perl -e'%h=map{/.\s/;99**(ord$&&7)-$`,$_}`du -h`;die@h{sort%h}'

2
เวอร์ชั่นสั้นของคุณมีผลต่อstderrเนื่องจากdieคุณสามารถเปลี่ยนมันเพื่อให้มันออกมาstdout?
Dennis Williamson

2
เปลี่ยนdieไปและมันจะไปprint stdoutมันเป็นแค่ตัวละครอีกสองตัว
Adam Bellaire

ทำงานบน Ubuntu!
marinara

แฮร์รี่ perl ที่น่าประทับใจ
nandoP

ผลลัพธ์อยู่ในลำดับย้อนกลับ :(
RSFalcon7 7

55

มีเครื่องมือที่มีประโยชน์อย่างมากที่ฉันใช้เรียกว่าncduที่ออกแบบมาเพื่อค้นหาโฟลเดอร์และไฟล์ที่มีการใช้งานดิสก์สูงและลบพวกเขา มันขึ้นอยู่กับคอนโซลรวดเร็วและเบาและมีแพ็คเกจสำหรับการแจกแจงหลักทั้งหมด


ดีมาก ... ฉันน่าประหลาดใจถ้าผลลัพธ์จะถูกป้อนให้เป็นมาตรฐาน ... ฉันขี้เกียจมากที่ฉันไม่สามารถอ่านคู่มือได้
ojblass

8
gt5อยู่ในหลอดเลือดดำเดียวกัน คุณสมบัตินักฆ่ามันแสดงการเติบโต
Tobu

1
มันเจ๋งจริงๆ! และเร็วกว่าการไปduไหนมาไหนด้วยหากคุณต้องการระบุไดเรกทอรีขนาดใหญ่
BurninLeo

44
du -k * | sort -nr | cut -f2 | xargs -d '\n' du -sh

ไม่สามารถใช้กับdu -k --totalให้ข้อผิดพลาดในตอนท้ายdu: cannot access 'total': No such file or directory
laggingreflex

ฉันชอบคำตอบอื่นอีกแล้ว คุณจะแสดงเฉพาะ 50 รายการแรกอย่างไร
Mau

1
@Mauro - เพียงส่งผลลัพธ์ให้headโดยการเพิ่ม `| หัว -50` ในตอนท้าย
Samuel Lelièvre

21

เท่าที่ฉันเห็นคุณมีสามตัวเลือก:

  1. แก้ไขduเพื่อจัดเรียงก่อนแสดง
  2. แก้ไขsortเพื่อรองรับขนาดของมนุษย์สำหรับการเรียงลำดับตัวเลข
  3. โพสต์ประมวลผลเอาต์พุตจากการเรียงลำดับเพื่อเปลี่ยนเอาต์พุตพื้นฐานเป็นมนุษย์ที่สามารถอ่านได้

คุณสามารถทำได้du -kและใช้ชีวิตกับขนาดใน KiB

สำหรับตัวเลือก 3 คุณสามารถใช้สคริปต์ต่อไปนี้:

#!/usr/bin/env python

import sys
import re

sizeRe = re.compile(r"^(\d+)(.*)$")

for line in sys.stdin.readlines():
    mo = sizeRe.match(line)
    if mo:
        size = int(mo.group(1))
        if size < 1024:
            size = str(size)+"K"
        elif size < 1024 ** 2:
            size = str(size/1024)+"M"
        else:
            size = str(size/(1024 ** 2))+"G"

        print "%s%s"%(size,mo.group(2))
    else:
        print line

20

ฉันมีปัญหาเช่นกันและตอนนี้ฉันกำลังใช้วิธีแก้ปัญหา:

du -scBM | sort -n

สิ่งนี้จะไม่สร้างค่าที่ปรับขนาด แต่จะสร้างขนาดเป็นเมกะไบต์เสมอ มันน้อยกว่าที่สมบูรณ์แบบ แต่สำหรับฉันมันดีกว่าไม่มีอะไร (หรือแสดงขนาดเป็นไบต์)


ฉันชอบสวิตช์ th-BM ซึ่งโดยทั่วไปเหมือนกับ -m แต่มันมีข้อได้เปรียบในการแสดงขนาดและ M postfixed มันดังนั้นคุณจะได้รับ 10M ซึ่งชัดเจนกว่าแค่ 10 :)
Tom Feiner

นี่เป็นทางออกที่ง่ายที่สุดที่ฉันเคยเห็นในหน้านี้ขอบคุณ!
Jeff Olson

19

พบโพสต์นี้ที่อื่น ดังนั้นเชลล์สคริปต์นี้จะทำสิ่งที่คุณต้องการโดยไม่ต้องโทรหาduทุกอย่างสองครั้ง มันใช้awkในการแปลงไบต์ดิบเป็นรูปแบบที่มนุษย์สามารถอ่านได้ แน่นอนว่าการจัดรูปแบบแตกต่างกันเล็กน้อย (ทุกอย่างถูกพิมพ์ด้วยความแม่นยำทศนิยมหนึ่งตำแหน่ง)

#/bin/bash
du -B1 | sort -nr  |awk '{sum=$1;
hum[1024**3]="G";hum[1024**2]="M";hum[1024]="K";
for (x=1024**3; x>=1024; x/=1024){
        if (sum>=x) { printf "%.1f%s\t\t",sum/x,hum[x];print $2;break
}}}'

ใช้งานใน.vimไดเรกทอรีของฉันผลผลิต:

4.4M            .
3.6M            ./colors
372.0K          ./plugin
128.0K          ./autoload
100.0K          ./syntax
100.0K          ./doc

(ฉันหวังว่าโครงร่างสี 3.6M จะไม่มากเกินไป)


1
ฉันมีคำตอบ Perl ด้วย แต่ฉันคิดว่ามันอาจทำให้คนเกลียดฉัน: du -B1 | เรียงลำดับ -nr | perl -e '% h = (0 => b, 1 => K, 2 => M, 3 => G); สำหรับ (<>) {($ s, @ f) = แยก / \ s + /; $ e = 3; $ e-- ในขณะที่ (1024 ** $ e> $ s); $ v = ($ s / (1024 ** $ e)); printf "% -8s% s \ n", sprintf ($ v> = 100? "% d% s": "% .1f% s", $ s / (1024 ** $ e), $ h {$ e}), @ f;} '
อดัมเบลแลร์

แม้ว่าคำตอบ Perl จริงให้การจัดรูปแบบของมันใกล้กับ du แม้ว่าการปัดเศษจะปิด ... มันดูเหมือน du เสมอให้ ceil () มากกว่ารอบ ()
อดัมเบลแลร์

เฮ้ทำไมฉันถึงใช้แฮชที่นั่น? ควรจะได้รับการอาร์เรย์ ... ตอนเช้าสมองบ่น ....
อดัมเบลแลร์

เพิ่มโซลูชัน Perl ที่ดีขึ้นเป็นคำตอบอื่น
Adam Bellaire

ทั้งสองเวอร์ชันล้มเหลวเมื่อชื่อไฟล์มีช่องว่าง
Vi

15

รุ่นนี้ใช้awkในการสร้างคอลัมน์พิเศษสำหรับการจัดเรียงคีย์ โทรduครั้งเดียวเท่านั้น ผลลัพธ์ควรมีลักษณะเหมือนduกันทุกประการ

ฉันแบ่งมันเป็นหลายบรรทัด แต่สามารถรวมกันเป็นหนึ่งซับได้

du -h |
  awk '{printf "%s %08.2f\t%s\n", 
    index("KMG", substr($1, length($1))),
    substr($1, 0, length($1)-1), $0}' |
  sort -r | cut -f2,3

คำอธิบาย:

  • BEGIN - สร้างสตริงเพื่อทำดัชนีเพื่อแทนที่ 1, 2, 3 สำหรับ K, M, G สำหรับการจัดกลุ่มตามหน่วยหากไม่มีหน่วย (ขนาดน้อยกว่า 1K) แสดงว่าไม่มีการจับคู่และศูนย์คืน (สมบูรณ์! )
  • พิมพ์เขตข้อมูลใหม่ - หน่วยค่า (เพื่อให้การเรียงลำดับตัวอักษรทำงานอย่างถูกต้องมันเป็นศูนย์ความยาวคงที่) และบรรทัดเดิม
  • จัดทำดัชนีอักขระตัวสุดท้ายของฟิลด์ขนาด
  • ดึงส่วนที่เป็นตัวเลขของขนาดออกมา
  • จัดเรียงผลลัพธ์ละทิ้งคอลัมน์เพิ่มเติม

ลองใช้โดยไม่มีcutคำสั่งเพื่อดูว่ากำลังทำอะไรอยู่

นี่คือเวอร์ชันที่ทำการเรียงลำดับภายในสคริปต์ AWK และไม่ต้องการcut:

du -h |
   awk '{idx = sprintf("%s %08.2f %s", 
         index("KMG", substr($1, length($1))),
         substr($1, 0, length($1)-1), $0);
         lines[idx] = $0}
    END {c = asorti(lines, sorted);
         for (i = c; i >= 1; i--)
           print lines[sorted[i]]}'

ขอขอบคุณ! นี่เป็นตัวอย่างแรกที่ทำงานกับฉันใน OS X 10.6 ไม่นับ perl / phython-สคริปต์ และขอขอบคุณอีกครั้งสำหรับคำอธิบายที่ดี ยินดีที่ได้เรียนรู้สิ่งใหม่เสมอ awk แน่ใจว่าเป็นเครื่องมือที่มีประสิทธิภาพ
Wolf

ขอบคุณมากสำหรับสิ่งนั้น ฉันเปลี่ยน du เป็นdu -sh *แสดงไฟล์และไดเรกทอรีทันทีโดยไม่ต้องเรียกซ้ำ
HankCa

15

นี่คือตัวอย่างที่แสดงไดเรกทอรีในรูปแบบสรุปย่อ ๆ มันจัดการช่องว่างในไดเรกทอรี / ชื่อไฟล์

% du -s * | sort -rn | cut -f2- | xargs -d "\n" du -sh

53G  projects
21G  Desktop
7.2G VirtualBox VMs
3.7G db
3.3G SparkleShare
2.2G Dropbox
272M apps
47M  incoming
14M  bin
5.7M rpmbuild
68K  vimdir.tgz

1
ผู้ใช้ macOS / OSX ได้รับการเตือนว่า xargs รุ่น mac ไม่สนับสนุนแฟล็ก -d และหากคุณเว้นไว้ไดเรกทอรีใด ๆ ที่มีช่องว่างจะมีคำแยกวิเคราะห์แต่ละคำซึ่งแน่นอนว่าล้มเหลว
jasonology


9

ฉันได้ง่าย แต่มีประโยชน์สำหรับห่อหุ้มหลาม du เรียกdutop โปรดทราบว่าเรา (ผู้ดูแล coreutils) กำลังพิจารณาเพิ่มฟังก์ชันการทำงานเพื่อเรียงลำดับการเรียงลำดับผลลัพธ์ "มนุษย์" โดยตรง


1
+1 สำหรับหนึ่งในข้อยกเว้นที่หายากและถูกต้องเพื่อ "ทำสิ่งหนึ่งและทำถูกต้อง" หากไม่มีใครได้รับการจัดเรียงเพื่อทำความเข้าใจ SI-prefix และ / หรือคำนำหน้าไบนารี
Joachim Sauer

และตามที่ ptman กล่าวถึงด้านล่าง: ta da ! ( sortธงใหม่)
Tobu

9

มีอีกอันหนึ่ง:

$ du -B1 | sort -nr | perl -MNumber::Bytes::Human=format_bytes -F'\t' -lane 'print format_bytes($F[0])."\t".$F[1]'

ฉันเริ่มชอบ Perl คุณอาจต้องทำ

$ cpan Number::Bytes::Human

เป็นครั้งแรก สำหรับแฮ็กเกอร์ perl ทุกคนที่นั่น: ใช่ฉันรู้ว่าส่วนการเรียงลำดับสามารถทำได้ด้วย perl อาจเป็นส่วนที่ du เกินไป


8

ตัวอย่างข้อมูลนี้ถูกคว้าไร้ยางอายจาก Jean-Pierre จากhttp://www.unix.com/shell-programming-scripting/32555-du-h-sort.html มีวิธีที่ฉันจะให้เครดิตเขาดีกว่านี้หรือไม่

du -k | sort -nr | awk '
     BEGIN {
        split("KB,MB,GB,TB", Units, ",");
     }
     {
        u = 1;
        while ($1 >= 1024) {
           $1 = $1 / 1024;
           u += 1
        }
        $1 = sprintf("%.1f %s", $1, Units[u]);
        print $0;
     }
    '

ฉันคิดว่าถ้ามันเป็นจำนวนมากแล้วหน่วยจะหายไปและจำนวนที่แสดงมีขนาดเล็ก ... ลอง23423423432423
nopole

7

ใช้แฟล็ก "-g"

 -g, --general-numeric-sort
              compare according to general numerical value

และในไดเร็กทอรี / usr / local ของฉันจะสร้างเอาต์พุตเช่นนี้:

$ du |sort -g

0   ./lib/site_ruby/1.8/rubygems/digest
20  ./lib/site_ruby/1.8/rubygems/ext
20  ./share/xml
24  ./lib/perl
24  ./share/sgml
44  ./lib/site_ruby/1.8/rubygems/package
44  ./share/mime
52  ./share/icons/hicolor
56  ./share/icons
112 ./share/perl/5.10.0/YAML
132 ./lib/site_ruby/1.8/rubygems/commands
132 ./share/man/man3
136 ./share/man
156 ./share/perl/5.10.0
160 ./share/perl
488 ./share
560 ./lib/site_ruby/1.8/rubygems
604 ./lib/site_ruby/1.8
608 ./lib/site_ruby

4
นั่นไม่ได้ให้ผลลัพธ์ที่มนุษย์สามารถอ่านได้ซึ่งเป็นสิ่งที่ OP กำลังมองหา


4

นี่คือวิธีการง่ายๆที่ฉันใช้การใช้ทรัพยากรที่ต่ำมากและทำให้คุณได้รับสิ่งที่คุณต้องการ:

du --max-depth=1 | sort -n | awk 'BEGIN {OFMT = "%.0f"} {print $1/1024,"MB", $2}'

0 MB ./etc
1 MB ./mail
2 MB ./tmp
123 MB ./public_html

4

พบรายการนี้ในบรรทัด ... ดูเหมือนว่าจะใช้ได้

du -sh * | tee /tmp/duout.txt | grep G | sort -rn ; cat /tmp/duout.txt | grep M | sort -rn ; cat /tmp/duout.txt | grep K | sort -rn ; rm /tmp/duout.txt

ฉันสร้างสคริปต์ขึ้นมาอย่างไม่รัดกุมบนพื้นฐานนี้เพื่อสร้างเอาต์พุต du (1) ที่มนุษย์อ่านได้ โปรดดูคำตอบของฉัน, serverfault.com/a/937459/218692
Tripp Kinetics

3

ฉันเรียนรู้ awk จากการปรุงตัวอย่างนี้เมื่อวานนี้ ใช้เวลาสักครู่ แต่มันก็สนุกดีและฉันเรียนรู้วิธีใช้ awk

มันรันเพียงหนึ่งครั้งและมีเอาต์พุตคล้ายกับ du -h

du --max-depth=0 -k * | sort -nr | awk '{ if($1>=1024*1024) {size=$1/1024/1024; unit="G"} else if($1>=1024) {size=$1/1024; unit="M"} else {size=$1; unit="K"}; if(size<10) format="%.1f%s"; else format="%.0f%s"; res=sprintf(format,size,unit); printf "%-8s %s\n",res,$2 }'

มันแสดงให้เห็นว่าตัวเลขต่ำกว่า 10 ที่มีจุดทศนิยมหนึ่ง



2

หากคุณต้องการจัดการช่องว่างคุณสามารถใช้สิ่งต่อไปนี้

 du -d 1| sort -nr | cut -f2 | sed 's/ /\\ /g' | xargs du -sh

คำสั่ง sed เพิ่มเติมจะช่วยบรรเทาปัญหาเกี่ยวกับโฟลเดอร์ที่มีชื่อเช่น Application Support


เพิ่งลองสิ่งนี้ใน macOS Sierra ทำงานได้ตามที่คาดหวัง ดี!
jasonology


1

http://dev.yorhel.nl/ncdu

คำสั่ง: ncdu

การนำทางไดเรกทอรีการเรียงลำดับ (ชื่อและขนาด) กราฟการอ่านของมนุษย์ ฯลฯ ...


1
อรรถประโยชน์ที่ยอดเยี่ยม แต่ไม่ได้ติดตั้งเป็นค่าเริ่มต้นในระบบปฏิบัติการใด ๆ ที่ฉันทราบ ไม่จำเป็นต้องเป็นปัญหา แต่มีอีกหนึ่งโปรแกรมที่ต้องคอยดูแล ...
voretaq7

1

awkทางออกอื่น-

du -k ./* | sort -nr | 
awk '
{split("KB,MB,GB",size,",");}
{x = 1;while ($1 >= 1024) 
{$1 = $1 / 1024;x = x + 1} $1 = sprintf("%-4.2f%s", $1, size[x]); print $0;}'


[jaypal~/Desktop/Reference]$ du -k ./* | sort -nr | awk '{split("KB,MB,GB",size,",");}{x = 1;while ($1 >= 1024) {$1 = $1 / 1024;x = x + 1} $1 = sprintf("%-4.2f%s", $1, size[x]); print $0;}'
15.92MB ./Personal
13.82MB ./Personal/Docs
2.35MB ./Work Docs
1.59MB ./Work Docs/Work
1.46MB ./Personal/Raa
584.00KB ./scan 1.pdf
544.00KB ./Personal/Resume
44.00KB ./Membership.xlsx
16.00KB ./Membership Transmittal Template.xlsx

1

ฉันใช้โซลูชันที่ให้โดย @ptman แต่การเปลี่ยนแปลงเซิร์ฟเวอร์ล่าสุดทำให้ไม่สามารถใช้งานได้อีกต่อไป ฉันใช้สคริปต์ทุบตีต่อไปนี้แทน:

#!/bin/bash
# File: duf.sh
# list contents of the current directory by increasing 
#+size in human readable format

# for some, "-d 1" will be "--maxdepth=1"
du -k -d 1 | sort -g | awk '
{
if($1<1024)
    printf("%.0f KB\t%s",$1,$2);
else if($1<1024*1024)
    printf("%.1f MB\t%s",$1/1024,$2);
else
    printf("%.1f GB\t%s",$1/1024/1024,$2);
}'

BSD du -d 1ไวยากรณ์ได้รับการสนับสนุนโดย GNU du ตั้งแต่ coreutils 8.6 ได้รับการปล่อยตัวในปี 2010 (แม้ว่าจะเป็นครั้งแรกที่ความพร้อมหมวกสีแดงเป็น RHEL 7 ในปี 2014) --maxdepth=1ดังนั้นคุณจึงไม่จำเป็นต้อง ฉันเพิ่งค้นพบเกี่ยวกับสิ่งนี้เมื่อไม่นานมานี้เอง
Adam Katz


1

มีคำตอบมากมายที่นี่ซึ่งหลายคำซ้ำกัน ฉันเห็นแนวโน้มสามประการ: การไพพ์ผ่านการเรียกดูครั้งที่สองโดยใช้รหัส shell / awk ที่ซับซ้อนและการใช้ภาษาอื่น

นี่คือโซลูชันที่สอดคล้องกับ POSIXโดยใช้duและawkที่ควรทำงานได้กับทุกระบบ

ฉันใช้วิธีที่แตกต่างกันเล็กน้อยเพิ่ม-xเพื่อให้แน่ใจว่าเรายังคงอยู่ในระบบไฟล์เดียวกัน (ฉันต้องการเพียงแค่การดำเนินการนี้เมื่อฉันมีพื้นที่ว่างในดิสก์สั้นเท่านั้นดังนั้นเหตุใดจึงคัดแยกสิ่งที่ฉันติดตั้งภายในต้นไม้ FS หรือย้ายแล้ว symlinked back?) และแสดงหน่วยคงที่เพื่อให้การแยกวิเคราะห์ภาพง่ายขึ้น ในกรณีนี้ฉันมักจะเลือกที่จะไม่เรียงลำดับดังนั้นฉันจึงสามารถเห็นโครงสร้างลำดับชั้นได้ดีขึ้น

sudo du -x | awk '
  $1 > 2^20 { s=$1; $1=""; printf "%7sG%s\n", sprintf("%.2f",s/2^21), $0 }'

(เนื่องจากนี่เป็นหน่วยที่สอดคล้องกันจากนั้นคุณสามารถต่อท้าย| sort -nหากคุณต้องการเรียงลำดับผลลัพธ์จริง ๆ )

สิ่งนี้จะกรองไดเรกทอรีที่มีเนื้อหา (สะสม) ไม่เกิน 512MB จากนั้นแสดงขนาดเป็นกิกะไบต์ โดยค่าเริ่มต้น du ใช้ขนาดบล็อก 512 ไบต์ (ดังนั้นเงื่อนไขของ awk ของ 2 20บล็อกคือ 512MB และตัวหาร21 21แปลงหน่วยเป็น GB - เราสามารถใช้du -kxด้วย$1 > 512*1024และs/1024^2เป็นมนุษย์อ่านได้มากขึ้น) ภายในเงื่อนไข awk เรากำหนดsขนาดเพื่อให้เราสามารถลบออกจากบรรทัด ( $0) สิ่งนี้จะรักษาตัวคั่น (ซึ่งถูกยุบลงในช่องว่างเดียว) ดังนั้นสุดท้ายจะ%sแทนช่องว่างและจากนั้นชื่อของไดเรกทอรีรวม %7sจัด%.2fขนาด GB ที่ปัดเศษ(เพิ่มขึ้น%8sหากคุณมี> 10TB)

แตกต่างจากโซลูชันส่วนใหญ่ที่นี่การสนับสนุนไดเรกทอรีที่มีช่องว่างในชื่ออย่างถูกต้อง (แม้ว่าทุกโซลูชันรวมถึงโซลูชันนี้จะทำหน้าที่ผิดชื่อไดเรกทอรีที่มีการแบ่งบรรทัด)


0

อย่างน้อยด้วยเครื่องมือทั่วไปสิ่งนี้จะยากเพราะรูปแบบที่มีตัวเลขที่มนุษย์อ่านได้ (โปรดทราบว่าการเรียงลำดับเป็น "งานที่ดี" ที่นี่เนื่องจากเรียงลำดับหมายเลข - 508, 64, 61, 2, 2 - มัน ไม่สามารถเรียงลำดับตัวเลขทศนิยมด้วยตัวคูณเพิ่มเติมได้

ฉันจะลองอีกทางหนึ่ง - ใช้เอาต์พุตจาก "du | sort -n -r" แล้วแปลงตัวเลขเป็นรูปแบบที่มนุษย์อ่านได้ด้วยสคริปต์หรือโปรแกรม


0

สิ่งที่คุณสามารถลองได้คือ:

for i in `du -s * | sort -n | cut -f2`
do
  du -h $i;
done

หวังว่าจะช่วย


ว่าเป็นสิ่งที่ไม่ xargs ;-)
cadrian

ฮิฮิฉันมักจะลืมเกี่ยวกับ xargs ;) ในตอนท้ายของวันอะไรก็ตามที่ได้รับงานเสร็จ imo

โดยค่าเริ่มต้น MacOSX (เช่นอยู่นอกการชงที่บ้าน) ไม่รองรับการใช้งานที่เหมาะสมxargsดังนั้นจึงจำเป็นต้องใช้แบบฟอร์มนี้ อย่างไรก็ตามสำหรับไฟล์ที่มีช่องว่างในนั้นคุณจำเป็นต้องตั้งค่า IFS:IFS=$'\n'
HankCa

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.