Sắp xếp kích thước tập tin con người có thể đọc được


16

Làm cách nào tôi có thể sắp xếp danh sách bằng cách sử dụng sắp xếp kích thước tệp có thể đọc được, sắp xếp bằng số có định danh kích thước (G, M, K) vào tài khoản? Tôi có thể sắp xếp du -shđầu ra "" chẳng hạn?

Vấn đề: Xem xét vấn đề liệt kê các tệp / thư mục và sắp xếp chúng theo kích thước của chúng. Bạn có thể đạt được điều đó bằng cách chạy:

du -s * | sort -n

Điều này liệt kê các tập tin / thư mục được sắp xếp theo kích thước của chúng. Tuy nhiên, giá trị kích thước in được tính bằng byte (hoặc megabyte hoặc gigabyte nếu bạn chọn).

Có thể mong muốn có thể sắp xếp dựa trên các giá trị có thể đọc được của con người, vì vậy tôi có thể chạy một cái gì đó tương tự như

du -sh * | <human-readable file sort>

Và có thư mục 1,5 GB hiển thị sau 2.0M.

Câu trả lời:



29

Sử dụng lõi GNU> = 7.5:

du -hs * | sắp xếp

(Lấy từ câu hỏi về lỗi máy chủ này )

Trang nam

Chỉnh sửa: Bạn có thể kiểm tra các phiên bản của mình bằng cách sử dụng du --versionsort --versionnếu bạn đang sử dụng các phiên bản GNU. Nếu bạn đang sử dụng homebrew, bạn có thể cần phải sử dụng gdugsort.


8
OSX không có tùy chọn này. Bạn có thể sử dụng homebrew để brew install coreutils(bổ sung tất cả các lệnh coreutils với 'g'). Bạn có thể làm sau đó gdu -hs * | gsort -h.
DSummersl

1
Chỉ cần làm rõ quan điểm của @ dsummersl: du -hs *hoạt động tốt trên Mac OS X, nhưng sort -htrả về sort: invalid option -- h. Người ta cũng có thể cài đặt gói coreutils thông qua MacPorts như được mô tả ở đây .
jvriesem

3

Nếu bạn chỉ lo lắng về các tệp lớn hơn 1MB, vì có vẻ như bạn là ai, bạn có thể sử dụng lệnh này để sắp xếp chúng và sử dụng awk để chuyển đổi kích thước thành MB:

du -s * | sort -n | awk '{print int($1 / 1024)"M\t"$2}'

Một lần nữa, điều này làm tròn kích thước đến MB gần nhất. Bạn có thể sửa đổi nó chuyển đổi sang đơn vị bạn chọn.


Điều này tương tự như : du -sm * | sort -n. -s/ -gtạo dukích thước đầu ra tính bằng megabyte / gigabyte.
không có

Đối với MB bạn phải chia thêm 1024. Vì vậy, nó sẽ làint($1 / (1024 * 1024))
Pratik Khadloya

2

Cái này xử lý tên tệp với khoảng trắng hoặc dấu nháy đơn và hoạt động trên các hệ thống không hỗ trợ xargs -dhoặc sort -h:

du -s * | sort -n | cut -f2 | tr '\n' '\0' | xargs -0 -I {} du -sh "{}"

kết quả là:

368K    diskmanagementd
392K    racoon
468K    coreaudiod
472K    securityd
660K    sshd
3.6M    php-fpm

1

Đây là một số khác:

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

Bạn có thể phải làm một

$ cpan Number::Bytes::Human

Đầu tiên.


1

du -sk * | sắp xếp -n | awk '{in $ 2}' | trong khi đọc f; làm du -sh "$ f"; làm xong


1

Lệnh này sẽ sắp xếp theo kích thước tính bằng MB

du --block-size=MiB --max-depth=1 path | sort -n

Đó đã là những gì người dùng thực sự đang làm, anh ấy / cô ấy đã không đưa ra ví dụ với MiB nhưng đã đề cập về nó. Những gì anh ấy / cô ấy đang tìm kiếm là có thể sắp xếp khi sử dụng -hcờ để du.
Tonin

0

Tôi đã kết thúc ở đây vì tôi đang cố gắng sắp xếp một thứ khác kết hợp MB và GB trong cùng một đầu ra và tôi không thể kiểm soát nó.

$NFđược sử dụng vì #GBhoặc #MBmẫu là cột cuối cùng trong đầu ra:

somecommand | \
gawk '{
  if ($NF ~ /[0-9\.]+GB/) 
    { a=gensub(/([0-9\.]+)(GB)/,"\\1","g",$NF); \
    printf "%sMB\n", a*1024} \
  else {print $NF} 
}' | \
sort -n

Giải thích về lệnh awk:

if ($NF ~ /[0-9\.]+GB/)

nếu cột cuối cùng khớp với mẫu biểu thức chính có chứa một chữ số hoặc một .hoặc nhiều lần theo sauGB

{ a=gensub(/([0-9\.]+)(GB)/,"\\1","g",$NF); \

sau đó đặt biến athành phần chữ số của mỗi dòng khớp với mẫu regex giống nhau trong cùng cột cuối cùng ( $NF)

printf "%sMB\n", a*1024} \

Sau khi cài đặt a, sử dụng printfđể định dạng đầu ra là${a*1024}MB

else {print $NF}

mặt khác chỉ cần in cột cuối cùng

sort -n

sử dụng sắp xếp số trên đầu ra


thí dụ

echo "4MB\n5GB\n420MB\n420GB\n1024MB\n1GB" | \                                                                                                                                 23:43:06 (EMP-2653/package-upgrades) Ø M
gawk '{
  if ($NF ~ /[0-9\.]+GB/)
    { a=gensub(/([0-9\.]+)(GB)/,"\\1","g",$NF); \
    printf "%sMB\n", a*1024} \
  else {print $NF}
}' | \
sort -n

Tôi chắc chắn có một cách để sử dụng lại mẫu regex vì vậy tôi chỉ thực hiện trận đấu một lần và thay thế tại chỗ, nhưng tôi không biết làm thế nào để làm điều đó :)

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.