DU: แสดงเฉพาะโฟลเดอร์ที่ระดับความลึก


12

ฉันได้รับผลลัพธ์จากdu -hสิ่งต่อไปนี้

103M    ./.wine/drive_c/windows/mono/mono-2.0/lib/mono
103M    ./.wine/drive_c/windows/mono/mono-2.0/lib
129M    ./.wine/drive_c/windows/mono/mono-2.0
129M    ./.wine/drive_c/windows/mono
362M    ./.wine/drive_c/windows
545M    ./.wine/drive_c

ฉันต้องการแสดงเฉพาะโฟลเดอร์ที่สามารถดำเนินการได้มากที่สุดเท่านั้นซึ่งคือโฟลเดอร์ ./.wine/drive_c/windows/mono/mono-2.0/lib/mono

มีวิธีใดที่จะลบโฟลเดอร์พาเรนต์ถ้าโฟลเดอร์ลูกรับผิดชอบการใช้พื้นที่ดิสก์ส่วนใหญ่หรือไม่?

การตั้งค่าเพื่อแสดงเฉพาะโฟลเดอร์ใบไม้อาจใช้เคล็ดลับหรือการตั้งค่าเพื่อลบขนาดของโฟลเดอร์ย่อยทั้งหมดจากโฟลเดอร์หลักเมื่อคำนวณขนาดของโฟลเดอร์หลัก


วิธีนี้มักจะง่ายต่อการติดตามด้วยสายตา ดูวิธีทำความเข้าใจว่ามีอะไรกินพื้นที่
Gilles 'หยุดชั่วร้าย'

คำตอบ:


12

หากคุณใช้ GNU du คุณสามารถใช้-Sหรือ--separate-dirsตัวเลือกเพื่อไม่รวมขนาดของไดเรกทอรีย่อยเมื่อคำนวณการใช้สำหรับผู้ปกครอง

duคำสั่งของคุณอาจไม่สนับสนุนตัวเลือกนี้

คุณสามารถใช้คู่นี้เรียงลำดับเพื่อรับไดเรกทอรีที่ใหญ่ที่สุด (สมมติว่าเครื่องมือ GNU):

du --separate-dirs -h . |sort -h

ดูเหมือนว่าจะตอบสนอง 'ลบขนาดของโฟลเดอร์ย่อยทั้งหมดออกจากโฟลเดอร์หลักเมื่อคำนวณขนาดของโฟลเดอร์หลัก' ส่วนหนึ่งของข้อความค้นหาของฉันดังนั้นอาจยอมรับได้! ผมไม่แน่ใจว่ามันตรงกับความพอใจของฉันแม้ว่า (พยายามที่จะหาโฟลเดอร์ที่ดำเนินการมากที่สุดในการลบเพื่อเรียกช่องว่าง)
EoghanM

9

โดยส่วนตัวฉันเพิ่งรวมเข้ากับพลังของการจัดเรียง GNU:

du -ch | sort -h

นี่จะทำให้ขนาดถูกเรียงในรูปแบบที่มนุษย์อ่านได้ ตัวอย่างเช่น:

$ du -h /usr/ | head -20 | sort -h
8.0K    /usr/src/linux-headers-3.2.0-3-common/include/misc
12K /usr/src/linux-headers-3.2.0-3-common/include/drm/i2c
12K /usr/src/linux-headers-3.2.0-3-common/include/net/netfilter/ipv4
16K /usr/src/linux-headers-3.2.0-3-common/include/net/netfilter/ipv6
20K /usr/src/linux-headers-3.2.0-3-common/include/net/phonet
28K /usr/src/linux-headers-3.2.0-3-common/include/acpi/platform
52K /usr/src/linux-headers-3.2.0-3-common/include/net/netns
60K /usr/lib32/libv4l
76K /usr/src/linux-headers-3.2.0-3-common/include/net/caif
96K /usr/src/linux-headers-3.2.0-3-common/include/scsi/fc
108K    /usr/src/linux-headers-3.2.0-3-common/include/net/bluetooth
112K    /usr/src/linux-headers-3.2.0-3-common/include/drm/ttm
148K    /usr/src/linux-headers-3.2.0-3-common/include/net/netfilter
264K    /usr/src/linux-headers-3.2.0-3-common/include/rdma
284K    /usr/src/linux-headers-3.2.0-3-common/include/acpi
596K    /usr/src/linux-headers-3.2.0-3-common/include/drm
608K    /usr/src/linux-headers-3.2.0-3-common/include/scsi
668K    /usr/games
6.3M    /usr/lib32/gconv
8.9M    /usr/lib32

จากman sort:

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

มันยังแสดงสิ่งที่คุณไม่สนใจ แต่ตอนนี้มันง่ายมากที่จะค้นหาสิ่งที่คุณทำ


ไม่ที่ทำให้แย่ลงจริง ๆ เนื่องจากตอนนี้มันจะปรากฏ 545M ./.wine/drive_cที่ด้านบนของรายการแม้ว่าจะมีเพียงโฟลเดอร์และไม่มีไฟล์และทำให้ยากที่จะดูว่ามีการกระจายพื้นที่ในโฟลเดอร์ย่อย (recursive) ของ drive_c เพราะพวกเขาไม่ ไม่ปรากฏอย่างต่อเนื่องในรายการ
EoghanM

6

หากคุณกำลังมองหามุมมองที่ชัดเจนฉันขอแนะนำdurepแพ็คเกจ

ตัวอย่างผลลัพธ์:

root@dogmeat:~# durep -td 4 -hs 50M /usr/
[ /usr     4.8G (0 files, 9 dirs) ]
   1.9G [###########                   ]  38.57% lib/
     463.6M [#######                       ]  24.46% x86_64-linux-gnu/
         102.3M [######                        ]  22.07% wine/
     276.2M [####                          ]  14.57% i386-linux-gnu/
          96.1M [##########                    ]  34.80% wine/
     222.4M [###                           ]  11.73% libreoffice/
         189.3M [#########################     ]  85.12% program/
     122.6M [#                             ]   6.47% chromium-browser/
          87.6M [#####################         ]  71.46% chromium-browser
      79.5M [#                             ]   4.19% virtualbox/
      79.4M [#                             ]   4.19% jvm/
          73.4M [###########################   ]  92.52% java-7-openjdk-amd64/
              73.4M [############################# ]  99.99% jre/
      75.7M [#                             ]   3.99% python2.7/
          58.4M [#######################       ]  77.21% dist-packages/
      58.9M [                              ]   3.11% firefox/
      52.2M [                              ]   2.75% libwireshark.so.2.0.2
   1.4G [########                      ]  29.56% src/
   1.2G [#######                       ]  26.03% share/
     211.6M [####                          ]  16.54% fonts/
         199.3M [############################  ]  94.18% truetype/
              84.2M [############                  ]  42.23% horai-umefont/
     174.6M [####                          ]  13.64% icons/
          91.5M [###############               ]  52.39% gnome/
              66.4M [#####################         ]  72.60% icon-theme.cache
      77.5M [#                             ]   6.05% gimp/
          77.5M [##############################] 100.00% 2.0/
              66.2M [#########################     ]  85.43% help/
      74.4M [#                             ]   5.82% virtualbox/
          56.9M [######################        ]  76.42% VBoxGuestAdditions.iso
      62.9M [#                             ]   4.91% doc/
 240.1M [#                             ]   4.89% bin/

ใช้-tdพารามิเตอร์เพื่อระบุความลึกสูงสุดและ-hsพารามิเตอร์เพื่อระบุขนาดต่ำสุดสำหรับโฟลเดอร์ที่จะแสดงในผลลัพธ์


2

ไม่ได้จริงๆว่าถ้านี่คือสิ่งที่คุณต้องการ แต่คุณสามารถตัดไดเรกทอรีผู้ปกครองใช้ GNU find's -execdir:

find . -type d -execdir du -ch "{}" \;

-execdirตัวเลือกที่มีความคล้ายคลึงกับ-execแต่รันคำสั่งที่คุณจัดหาในไดเรกทอรีย่อยที่findได้พบไฟล์


hmmm ดูเหมือนจะไม่ทำงานตามที่คุณอธิบาย ฉันยังคงได้รับไดเรกทอรีหลักจำนวนมากในผลลัพธ์
EoghanM

2

หากคุณใช้duความลึกคงที่เช่นdu -m -d 2 .คุณสามารถปกปิดบรรทัดที่ไม่ถึงความลึกสูงสุดเช่น:

du -m -d 2 . | sort -k1n | awk -F"/" 'NF==3'

ในกรณีนี้ฉันต้องการความลึกของ 2 ไดเรกทอรีดังนั้นฉันจึงเก็บผลลัพธ์ที่มี 3 ฟิลด์ตามที่กำหนดไว้กับawkคำหลักNFหลังจากระบุ"/"เป็นตัวคั่นฟิลด์ของฉันเมื่อเริ่มต้น


0

ทั้งสองนี้ใช้ได้สำหรับฉัน:

 du -h | perl -ne '$n=()=$_=~m#/#g;  print unless $n > 2'
 du -h | perl -ne 'print unless ($n=()=$_=~m#/#g) > 2 '

ความคิดเห็นเล็กน้อยเพื่อให้ได้ตัวเลขที่ตรงกันการจับคู่ควรอยู่ในบริบทรายการที่ว่าทำไมเราต้องการ ()
Huw

du -h | Perl -ne 'พิมพ์เว้นแต่ (() = $ _ = ~ เมตร # / # g)> 2'
Huw
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.