Câu hỏi Làm thế nào tôi có thể sắp xếp du -h đầu ra theo kích thước


Tôi cần lấy danh sách đầu ra của người có thể đọc được.

Tuy nhiên, du không có tùy chọn "sắp xếp theo kích thước" và đường ống đến sort không hoạt động với cờ có thể đọc được của con người.

Ví dụ: chạy:

du | sort -n -r 

Xuất ra một dung lượng đĩa được sắp xếp theo kích thước (giảm dần):

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

Tuy nhiên, chạy nó với cờ có thể đọc được của con người, không sắp xếp đúng:

du -h | sort -n -r

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

Có ai biết cách sắp xếp không du -h  theo kích cỡ?


830
2018-02-25 13:42


gốc


Heh ... Funny bạn nên hỏi, vì điều này đã gây phiền nhiễu cho tôi ... ít nhất một năm ít nhất. Tuần trước, tôi đã tải xuống mã nguồn của GNU coreutils (trong đó sắp xếp là một phần), và có một cái nhìn, nhưng quyết định sẽ mất nhiều thời gian hơn tôi đã có trong tay để vá ... Bất cứ ai? :) - unwind
Đây là một câu hỏi liên quan nhiều: serverfault.com/q/737537/35034 - cregox
Bạn có xem thử cái này chưa? unix.stackexchange.com/questions/4681/…  Nó gần như là một bản sao và có giá trị vàng. Bạn làm bình thường du nhưng thêm -h vào sort chỉ huy. Bạn có thể thêm -rh do đó, tệp lớn nhất đầu tiên trong tệp, nếu không bạn cần tail để xem những chú heo con. - SDsolar
Tôi đã không mong đợi một câu hỏi như vậy để được phổ biến như vậy khi tôi googled này. - Mateen Ulhaq


Các câu trả lời:


Kể từ GNU coreutils 7.5 phát hành vào tháng 8 năm 2009, sort cho phép một -h tham số, cho phép hậu tố số của loại được tạo bởi du -h:

du -hs * | sort -h

Nếu bạn đang sử dụng một loại không hỗ trợ -h, bạn có thể cài đặt GNU Coreutils. Ví dụ. trên Mac OS X cũ hơn:

brew install coreutils
du -hs * | gsort -h

Từ sort hướng dẫn sử dụng:

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


1152
2017-07-01 12:29



Phần có liên quan của sổ tay: gnu.org/software/coreutils/manual/… - wodow
Dễ dàng cài đặt trên OS X với lõi cài đặt homebrew - brew. - Richard Poirier
Tốt nhất! Cá nhân tôi luôn làm du -BM | sort -nrnhư một cách giải quyết - nó là đủ khả năng đọc được của con người, và nó được sắp xếp, nếu có ai đó bị mắc kẹt với các lõi cũ hơn. - chutz
Nếu sử dụng trên OSX qua Homebrew, lưu ý rằng bây giờ bạn sẽ cần sử dụng gsort thay vì sắp xếp: du -hs * | gsort -h - Brian Cline
@PaulDraper, du -BM in mọi thứ theo megabyte, vì vậy một tệp có kích thước 168K sẽ hiển thị là 0M. Trừ khi có một số khác biệt phiên bản khác mà tôi không biết. Phiên bản của tôi về du chỉ hiển thị các giá trị số nguyên megabyte. - chutz


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

82
2018-02-25 13:52



Và nó sẽ làm một số lượng lớn trùng lặp đếm. - Douglas Leeder
Đầu tiên nó làm bình thường du - sau đó cho mỗi mục nó tính toán lại kích thước chỉ để in nó ở dạng người có thể đọc được. - Douglas Leeder
@ Douglas Leeder: bạn có quyền đếm trùng lặp, nhưng nghĩ rằng du thứ hai không bắt đầu từ bộ nhớ cache lạnh (nhờ hệ điều hành) @hasen j: xargs là một lệnh rất hữu ích, nó chia tách stdin của nó và nguồn cấp dữ liệu làm đối số cho lệnh đã cho - cadrian
Chris thực sự vượt trội vì nó hoạt động với các đường dẫn có khoảng trắng. Ném bỏ phiếu theo cách của bạn, bạn thân. - rbright
Xấu xí, nhưng đa nền tảng :). - voretaq7


@Douglas Leeder, một câu trả lời khác: Sắp xếp đầu ra có thể đọc được từ du -h bằng cách sử dụng công cụ khác. Giống như 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)}<>;'

Chia thành hai dòng để vừa với màn hình. Bạn có thể sử dụng nó theo cách này hoặc làm cho nó một lớp lót, nó sẽ hoạt động theo một trong hai cách.

Đầu ra:

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

CHỈNH SỬA: Sau một vài vòng chơi golf tại PerlMonks, kết quả cuối cùng là như sau:

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

59
2018-02-25 21:04



Phiên bản đầu ra ngắn của bạn trên stderr vì die bạn có thể thay đổi nó để làm cho nó đầu ra stdout? - Dennis Williamson
Thay đổi die đến một print và nó sẽ đi đến stdout. Nó chỉ là hai nhân vật nữa. - Adam Bellaire
hoạt động trên ubuntu! - marinara
ấn tượng perl hackistry - nandoP
Kết quả theo thứ tự ngược lại :( - RSFalcon7


Có một công cụ vô cùng hữu ích mà tôi sử dụng được gọi là ncdu được thiết kế để tìm kiếm các tệp và thư mục sử dụng đĩa cao, và loại bỏ chúng. Đó là giao diện điều khiển dựa trên, nhanh và nhẹ, và có các gói trên tất cả các bản phân phối chính.


50
2018-02-25 20:39



Rất đẹp ... Tôi tự hỏi nếu kết quả có thể được cung cấp cho tiêu chuẩn ra ... Tôi rất lười biếng mà tôi không thể đọc hướng dẫn - ojblass
gt5 ở cùng một mạch; tính năng sát thủ của nó đang hiển thị tăng trưởng. - Tobu
Điều đó thật tuyệt! Và nhanh hơn nhiều so với việc treo xung quanh du, nếu bạn chỉ muốn xác định các thư mục lớn. - BurninLeo


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

43
2018-02-25 14:01



chỉ là những gì tôi đang tìm kiếm cảm ơn - Edward Tanguay
Không thể sử dụng với du -k --total, cho lỗi ở cuối du: cannot access 'total': No such file or directory - laggingreflex
tôi thích câu trả lời này nữa. bạn sẽ chỉ hiển thị 50 kết quả đầu tiên như thế nào? - Mauro
@Mauro - chỉ cần kết quả là head bằng cách thêm `| đầu -50` ở cuối. - Samuel Lelièvre


Theo như tôi có thể thấy bạn có ba lựa chọn:

  1. Thay đổi du để sắp xếp trước khi hiển thị.
  2. Thay đổi sort để hỗ trợ kích thước con người cho số lượng.
  3. Đăng quá trình đầu ra từ sắp xếp để thay đổi đầu ra cơ bản thành con người có thể đọc được.

Bạn cũng có thể làm du -k và sống với kích thước trong KiB.

Đối với tùy chọn 3, bạn có thể sử dụng tập lệnh sau:

#!/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
2018-02-25 13:53





Tôi đã gặp vấn đề đó và tôi hiện đang sử dụng giải pháp thay thế:

du -scBM | sort -n

Điều này sẽ không tạo ra các giá trị được chia tỷ lệ, nhưng luôn tạo ra kích thước tính bằng megabyte. Đó là ít hơn sau đó hoàn hảo, nhưng đối với tôi nó tốt hơn so với không có gì (hoặc hiển thị kích thước bằng byte).


19
2018-02-25 13:56



Tôi thích th -BM switch, mà về cơ bản giống như -m, nhưng nó có lợi thế là hiển thị kích thước và M postfixed với nó, vì vậy bạn nhận được 10M đó là rõ ràng hơn nhiều so với chỉ 10 :) - Tom Feiner
Đây là giải pháp đơn giản nhất mà tôi từng thấy trên trang này, cảm ơn bạn! - Jeff Olson