kết hợp tốt nhất của 'du' và 'cây'


21

Tôi tự hỏi liệu chúng ta có thể kết hợp tính trung thực của 'du' với định dạng thụt lề của 'cây' không. Nếu tôi muốn một danh sách các kích cỡ của thư mục:

du -hx -d2

... Hiển thị hai cấp độ sâu và tất cả các tóm tắt kích thước là trung thực, nhưng không có sự thụt dòng của các thư mục con. Mặt khác:

tree --du -shaC -L 2

... thụt lề và tô màu độc đáo tuy nhiên kích thước được báo cáo là dối trá. Để có được kích thước thật người ta phải:

tree --du -shaC

... có nghĩa là bạn chỉ nhận được kích thước thật nếu bạn để 'cây' hiển thị cho bạn toàn bộ cấu trúc thư mục. Tôi muốn có thể luôn có các bản tóm tắt kích thước chính xác bất kể có bao nhiêu cấp độ con tôi muốn hiển thị. Tôi thường làm điều này:

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

... Loại bỏ tất cả mọi thứ trừ các thư mục và thụt lề chúng một cách độc đáo ... nhưng không có cách nào dễ dàng để giới hạn hiển thị chỉ ở một mức số nhất định (không có tóm tắt nằm). Là có một cách? Có lẽ tôi đã bỏ lỡ các công tắc chính xác ...

Câu trả lời:


8

Ngoài ra thanh toán ncdu : http://dev.yorhel.nl/ncdu

Trang của nó cũng liệt kê các "dự án tương tự" khác:

gt5 - Khá giống với ncdu, nhưng một cách tiếp cận khác.

tdu - Một tiện ích trực quan hóa sử dụng đĩa nhỏ dựa trên ncurses.

TreeSize - GTK, sử dụng một treeview.

Baobab - GTK, sử dụng biểu đồ hình tròn, treeview và treemap. Đi kèm với Gnome.

GdMap - GTK, với màn hình treemap.

Filelight - KDE, sử dụng biểu đồ hình tròn.

KDirStat - KDE, với màn hình treemap.

QĐiskUsage - Qt, sử dụng biểu đồ hình tròn.

xdiskusage - FLTK, với màn hình treemap.

fsv - Trực quan 3D.

Philesight - Bản sao của Filelight dựa trên web.


1
Cảm ơn David, cuối cùng đã có xung quanh để nhìn vào những người. Tôi chọn ncdu.
Ray Andrew

@David tdu đến từ đâu?
shirish

@shirish Tham khảo nguồn của tôi, lưu ý ở trên
David Potočnik

11

Bạn không cần phải grep cho mã màu, -dtùy chọn là list directories only.

Điều này dường như để làm những gì bạn muốn:

$ 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

Các greplệnh loại bỏ tất cả các dòng đã (một hoặc nhiều không gian tiếp theo một tổ chức phi không gian tiếp theo là một dấu cách) hai lần, theo sau là một [.

Nếu bạn muốn độ sâu là 1, hãy thay đổi số lượng ràng buộc bên trong dấu ngoặc nhọn {} thành {1}thay vì {2}. tương tự nếu bạn muốn độ sâu 3, thay đổi nó thành {3}.

Bạn có thể biến điều này thành một hàm shell, như vậy:

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
}

Điều này sử dụng getoptsđể "đánh cắp" bất kỳ -Ltùy chọn và đối số của nó từ treedòng lệnh, nếu có. Nếu không có -L ntùy chọn trên dòng lệnh, thì nó cũng hoạt động.

Tất cả các tùy chọn và đối số khác được truyền cho treelệnh.

Các local PATTERN=...dòng là không thực sự cần thiết. Tôi chỉ làm như vậy để đảm bảo rằng nó sẽ phù hợp với một dòng và không bao gồm từ ở đây U&L. Biểu thức chính quy có thể và có lẽ chỉ nên đi trực tiếp trên tree | grep ...dòng.

Chạy nó như thế này:

mytreedu 

hoặc là

mytreedu -L 2 /path/to/dir/

1
Tôi yêu mã, nhưng nhắc lại rằng bạn không thể sử dụng '-d' bởi vì nếu bạn làm vậy, các tóm tắt kích thước không chính xác hoặc ít nhất là chúng ở đây. Kích thước sẽ được báo cáo luôn là '4096', đó là kích thước của mục nhập cho chính thư mục, nhưng không phải là kích thước của tất cả nội dung của nó.
Ray Andrew

... đáng lẽ phải nói '4096' cho mỗi thư mục trong thư mục hiện tại ... nhưng bạn không nhận được kích thước của thư mục bao gồm các tệp.
Ray Andrew

bạn chỉ đề cập đến -Lnhư là một vấn đề, không đề cập gì -dcả. Bây giờ tôi nhìn kỹ hơn vào các con số được báo cáo, cả kích thước báo cáo tree --ducũng không tree --du -dgiống với những con số được báo cáo du.
cas

Điểm là bất cứ điều gì ít hơn một màn hình 100% sẽ không cung cấp cho bạn kích thước chính xác. Bạn có thể giới hạn thông qua '-d' hoặc '-L 2' hoặc bất cứ điều gì khác - nó không được hiển thị, nó không được tính theo kích thước.
Ray Andrew

tree --dudường như không để cho kích thước chính xác cho thư mục nào, có hoặc không có -dhoặc -L. Tôi không biết các con số được cho là gì, nhưng chúng không liên quan đến những dubáo cáo nào.
cas

3

Bạn có thể sử dụng dutree

nhập mô tả hình ảnh ở đây

  • đầu ra màu, theo biến môi trường LS_COLORS.
  • hiển thị cây hệ thống tập tin
  • khả năng tổng hợp các tệp nhỏ
  • khả năng loại trừ các tập tin hoặc thư mục
  • khả năng so sánh các thư mục khác nhau
  • nhanh, viết bằng Rust

1

Không có bất kỳ công cụ lệnh hoàn hảo nào để làm điều này, nhưng tôi đã tìm thấy hai cách gần nhau.

  • hiển thị cả kích thước thư mục và tệp, nhưng không hiển thị ở chế độ cây.

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

  • hiển thị ở chế độ cây nhưng chỉ có kích thước tệp, các thư mục được tính

    tree -ah /var/log -L 1


0

Lấy cảm hứng từ cas, giờ tôi đang làm điều này:

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

nếu bạn sẽ vứt bỏ tất cả các công cụ getopts, ít nhất bạn vẫn nên có "$@"ngay sau đó -shaC. mặt khác, chức năng đó được mã hóa cứng để chỉ hoạt động cho thư mục hiện tại.
cas

Khi chúng tôi đã làm việc, tôi sẽ hỏi bạn về điều đó: xin hãy giải thích. Đúng về "$ @" tất nhiên, nhưng cho đến nay tôi chỉ sử dụng nó trong thư mục hiện tại, vì vậy vẫn chưa nhận thấy điều đó. Tất cả những thứ 'getopts' này là mới đối với tôi, tôi muốn biết bạn đang nghĩ gì ở đó.
Ray Andrew

Một trong những lợi ích của việc sử dụng getoptslà các tùy chọn có thể xuất hiện theo bất kỳ thứ tự nào trên dòng lệnh. Phiên bản ban đầu của mytreehàm tôi đã viết đã sử dụng "$ 1" giống như của bạn, do đó, đối số độ sâu phải là đối số đầu tiên và nó không phải là tùy chọn. Tôi quyết định rằng nó không đủ tốt để sử dụng bash-buildin getoptsđể xử lý -Ltùy chọn. Điều này cho phép -L ntùy chọn xuất hiện bất cứ nơi nào trên dòng lệnh. Nó cũng cho phép nó là hoàn toàn tùy chọn.
cas

một cách khác để xem xét nó là getoptscho phép bạn viết các tập lệnh có các tùy chọn và đối số thực (thay vì chỉ tranh luận ở các vị trí được mã hóa cứng như $ 1 $ 2 $ 3, v.v.), giống như hầu hết các chương trình khác trên hệ thống của bạn. Và nếu bạn sử dụng getoptchương trình (lưu ý rằng không có s) từ util-linuxgói, bạn có thể sử dụng cả tùy chọn một chữ cái ngắn (ví dụ -l) và tùy chọn dài (như --long) giống như các chương trình GNU.
cas

À ... nó trở lại với tôi bây giờ. Vâng, tôi thực sự đã sử dụng nó một lần. Phải có cái nhìn khác về nó. Cảm ơn.
Ray Andrew
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.