รวมสิ่งที่ดีที่สุดของ 'du' และ 'ต้นไม้'


21

ฉันสงสัยว่าถ้าเราสามารถรวมความซื่อสัตย์ของ 'du' กับการจัดรูปแบบเยื้องของ 'ต้นไม้' ถ้าฉันต้องการรายการขนาดของไดเรกทอรี:

du -hx -d2

... แสดงสองระดับที่ลึกและสรุปขนาดทั้งหมดนั้นตรงไปตรงมา แต่ไม่มีส่วนของการเยื้อง ในทางกลับกัน:

tree --du -shaC -L 2

... เยื้องและ colorizes อย่างดี แต่ขนาดรายงานเป็นเรื่องโกหก ในการรับขนาดจริงต้อง:

tree --du -shaC

... ซึ่งจะบอกว่าคุณจะได้ขนาดที่แท้จริงถ้าคุณให้ 'tree' แสดงโครงสร้างไดเรกทอรีทั้งหมด ฉันต้องการที่จะสามารถสรุปขนาดที่ถูกต้องได้เสมอโดยไม่คำนึงถึงจำนวนระดับย่อยที่ฉันต้องการแสดงจริง ฉันมักจะทำสิ่งนี้:

tree -du -shaC | grep "\[01;34m"

... ที่ตัดทุกอย่างยกเว้นไดเรกทอรีและเยื้องมันอย่างดี ... แต่ไม่มีวิธีที่ง่ายในการ จำกัด การแสดงผลให้อยู่ในระดับจำนวนที่กำหนด มีวิธีหรือไม่? บางทีฉันอาจพลาดสวิตช์ที่ถูกต้อง ...

คำตอบ:


8

ชำระเงินด้วยncdu : http://dev.yorhel.nl/ncdu

หน้าของมันยังแสดงรายการ "โครงการที่คล้ายกัน" อื่น ๆ :

gt5 - ค่อนข้างคล้ายกับ ncdu แต่เป็นวิธีที่แตกต่าง

tdu - ยูทิลิตี้การสร้างภาพดิสก์ที่ใช้ ncurses ขนาดเล็กอื่น

TreeSize - GTK ใช้มุมมองแบบต้นไม้

Baobab - GTK ใช้แผนภูมิวงกลมมุมมองแบบต้นไม้และแบบทรีแมป มาพร้อมกับ GNOME

GdMap - GTK พร้อมจอแสดงผล treemap

Filelight - KDE ใช้แผนภูมิวงกลม

KDirStat - KDE พร้อมจอแสดงผล treemap

QDiskUsage - Qt โดยใช้แผนภูมิวงกลม

xdiskusage - FLTK พร้อมจอแสดงผล treemap

fsv - การสร้างภาพ 3 มิติ

Philesight - โคลนบนเว็บของ Filelight


1
ขอบคุณดาวิดในที่สุดก็ถึงเวลามองดูสิ่งเหล่านั้น ฉันเลือก ncdu
Ray Andrews

@ David คำว่ามาจากไหน
Shirish

@shirish อ้างถึงที่มาของฉันได้กล่าวไว้ข้างต้น
David Potočnik

11

คุณไม่จำเป็นต้อง grep สำหรับรหัสสีที่ตัวเลือก-dlist directories only

ดูเหมือนว่าจะทำสิ่งที่คุณต้องการ:

$ tree --du -d -shaC | grep -Ev '(  *[^ ]* ){2}\['
.
├── [  18]  dir1
├── [  30]  dir2
├── [ 205]  junk
│   ├── [  18]  dir1
│   ├── [  30]  dir2
│   └── [  76]  dir3
├── [ 119]  merge
└── [  20]  stuff

 4.4K used in 10 directories

grepคำสั่งลบทุกสายที่ได้ (หนึ่งหรือมากกว่าหนึ่งช่องว่างตามที่ไม่ใช่พื้นที่ตามด้วยช่องว่าง) [สองครั้งตามด้วย

หากคุณต้องการความลึก 1 เปลี่ยนจำนวนที่ถูกผูกไว้ภายในวงเล็บปีกกา {} เป็น {1}{2}มากกว่า เดียวกันถ้าคุณต้องการความลึกของ 3 {3}เปลี่ยนไป

คุณสามารถเปลี่ยนให้เป็นฟังก์ชันเชลล์ได้ดังนี้:

mytreedu() {
  local depth=''

  while getopts "L:" opt ; do
      case "$opt" in
          L) depth="$OPTARG" ;;
      esac
  done

  shift "$((OPTIND-1))"

  if [ -z "$depth" ] ; then
      tree --du -d -shaC "$@"
  else   
      local PATTERN='(  *[^ ]* ){'"$depth"'}\['
      tree --du -d -shaC "$@" | grep -Ev "$PATTERN"
  fi
}

สิ่งนี้ใช้getoptsเพื่อ "ขโมย" ใด ๆ-Lตัวเลือกและอาร์กิวเมนต์จากtreeบรรทัดคำสั่งหากมี หากไม่มี-L nตัวเลือกในบรรทัดคำสั่งแสดงว่าใช้งานได้เช่นกัน

ตัวเลือกและ args อื่น ๆ ทั้งหมดจะถูกส่งผ่านไปยัง treeคำสั่ง

local PATTERN=...สายไม่จำเป็นจริงๆ ฉันแค่ทำอย่างนั้นเพื่อให้แน่ใจว่ามันจะพอดีกับหนึ่งบรรทัดและไม่ตัดคำที่นี่U&Lแต่มันเหมือนว่าเพื่อให้แน่ใจว่ามันจะพอดีกับหนึ่งบรรทัดและไม่ได้เป็นคำห่อที่นี่ใน นิพจน์ทั่วไปสามารถและน่าจะตรงไปที่tree | grep ...บรรทัด

เรียกใช้เช่นนี้:

mytreedu 

หรือ

mytreedu -L 2 /path/to/dir/

1
ฉันชอบรหัส แต่ทำซ้ำที่คุณไม่สามารถใช้ '-d' เพราะถ้าคุณทำขนาดสรุปไม่ถูกต้องหรืออย่างน้อยก็อยู่ที่นี่ ขนาดจะถูกรายงานเสมอเป็น '4096' ซึ่งเป็นขนาดของรายการสำหรับตัวเอง แต่ไม่ใช่ขนาดของเนื้อหาทั้งหมด
Ray Andrews

... ควรจะบอกว่า '4096' สำหรับแต่ละไดเรกทอรีภายใต้ไดเรกทอรีปัจจุบัน ... แต่คุณไม่ได้ขนาดของ dir รวมถึงไฟล์
Ray Andrews

คุณพูด-Lว่าเป็นปัญหา แต่ไม่ได้พูดถึง-dเลย ตอนนี้ที่ผมมองอย่างใกล้ชิดที่ตัวเลขรายงานค่าtree --duมิได้ขนาดรายงานว่าในทางใดทางหนึ่งมีลักษณะคล้ายกับผู้ที่รายงานโดยtree --du -d du
cas

ชี้ให้เห็นว่าสิ่งใดก็ตามที่แสดงน้อยกว่า 100% จะไม่ทำให้คุณมีขนาดที่ถูกต้อง คุณสามารถ จำกัด ผ่าน '-d' หรือ '-L 2' หรืออะไรก็ได้ - มันไม่แสดง, มันไม่ได้นับขนาด
Ray Andrews

tree --duดูเหมือนจะไม่ให้มีขนาดที่ถูกต้องสำหรับไดเรกทอรีแล้วมีหรือไม่มีหรือ-d -Lฉันไม่รู้ว่าตัวเลขควรเป็นอย่างไร แต่ไม่เกี่ยวข้องกับduรายงานใด
cas

3

คุณสามารถใช้dutree

ป้อนคำอธิบายรูปภาพที่นี่

  • เอาต์พุตสีตามตัวแปรสภาวะแวดล้อม LS_COLORS
  • แสดงแผนผังระบบไฟล์
  • ความสามารถในการรวมไฟล์ขนาดเล็ก
  • ความสามารถในการแยกไฟล์หรือไดเรกทอรี
  • ความสามารถในการเปรียบเทียบไดเรกทอรีต่าง ๆ
  • รวดเร็วเขียนใน Rust

1

ไม่มีเครื่องมือคำสั่งที่สมบูรณ์แบบในการทำเช่นนี้ แต่ฉันพบสองวิธีที่ใกล้เคียง

  • แสดงทั้งโฟลเดอร์และขนาดไฟล์ แต่ไม่แสดงในโหมดต้นไม้

    du -ah --max-depth=1 /var/log

  • แสดงในโหมดต้นไม้ แต่มีเพียงขนาดไฟล์เท่านั้นโฟลเดอร์จะถูกนับ

    tree -ah /var/log -L 1


0

แรงบันดาลใจจาก cas ฉันกำลังทำสิ่งนี้:

treee ()
{
    integer levels=$(( ($1 + 1) * 4 ))
    tree --du -shaC | grep "\[01;34m" | grep -Ev "^[^\[]{$levels}\[*"
    du -sh .
}

ถ้าคุณกำลังจะทิ้งทุกสิ่ง getopts อย่างน้อยคุณควรจะยังทันทีหลังจากที่"$@" -shaCไม่เช่นนั้นฟังก์ชั่นนั้นจะใช้ฮาร์ดโค้ดเพื่อใช้งานกับไดเรกทอรีปัจจุบันเท่านั้น
cas

เมื่อเราได้ทำงานฉันจะถามคุณเกี่ยวกับเรื่องนั้น: โปรดอธิบายอย่างละเอียด ถูกต้องเกี่ยวกับ "$ @" แน่นอน แต่จนถึงตอนนี้ฉันเคยใช้มันใน dir ปัจจุบันเท่านั้นดังนั้นฉันยังไม่สังเกตเห็นเลย ทุกสิ่งที่ 'getopts' นี้ใหม่สำหรับฉันฉันอยากรู้ว่าคุณคิดอะไรอยู่ที่นั่น
Ray Andrews

ข้อดีอย่างหนึ่งของการใช้getoptsคือตัวเลือกสามารถปรากฏในลำดับใดก็ได้ในบรรทัดคำสั่ง รุ่นเริ่มต้นของmytreeฟังก์ชั่นที่ฉันเขียนใช้ "$ 1" เช่นเดียวกับที่คุณทำดังนั้นการโต้แย้งเชิงลึกต้องเป็นอาร์กิวเมนต์แรกและไม่ใช่ตัวเลือก ฉันตัดสินใจว่าไม่ดีพอดังนั้นจึงใช้ bash-builtin getoptsเพื่อประมวลผล-Lตัวเลือก สิ่งนี้อนุญาตให้-L nตัวเลือกปรากฏที่ใดก็ได้บนบรรทัดคำสั่ง นอกจากนี้ยังอนุญาตให้เป็นตัวเลือกอย่างสมบูรณ์
cas

อีกวิธีในการดูคือgetoptsช่วยให้คุณสามารถเขียนสคริปต์ที่ใช้ตัวเลือกและข้อโต้แย้งจริง ๆ (ไม่ใช่แค่วางในตำแหน่งที่กำหนดรหัสยากเช่น $ 1 $ 2 $ 3 ฯลฯ ) เช่นเดียวกับโปรแกรมอื่น ๆ ในระบบของคุณ และถ้าคุณใช้getoptโปรแกรม (หมายเหตุที่ไม่มีs) จากutil-linuxแพ็คเกจคุณสามารถใช้ทั้งตัวเลือกแบบตัวอักษรสั้น (เช่น-l) และตัวเลือกแบบยาว (เช่น--long) เหมือนกับโปรแกรม GNU
cas

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