Làm thế nào để liệt kê tất cả các tập tin theo thứ tự kích thước


241

Tôi muốn liệt kê tất cả các tệp theo thứ tự từ lớn đến nhỏ và các tệp có thể có mặt ở bất cứ đâu trong một thư mục nhất định.



5
từ man ls:-S sort by file size
ctrl-alt-delor

Bạn có nghĩa là các tập tin có trong thư mục này, hay các tập tin có thể nằm trong bất kỳ thư mục con nào.
ctrl-alt-delor

Nếu bạn có thể / muốn sử dụng một công cụ GUI, hãy xem qua QĐirStat , trước đây là KDirStat .
RhinoDevel

Câu trả lời:


290

Đơn giản chỉ cần sử dụng một cái gì đó như:

ls -lS /path/to/folder/

Capital S .

Điều này sẽ sắp xếp các tập tin theo kích thước.

Cũng thấy:

man ls

-S     sort by file size

Nếu bạn muốn sắp xếp theo thứ tự ngược lại , chỉ cần thêm -rchuyển đổi.

Cập nhật:

Để loại trừ các thư mục (và được cung cấp không có tên tệp hoặc mục tiêu liên kết tượng trưng nào chứa các ký tự dòng mới):

ls -lS | grep -v '^d' 

Cập nhật 2:

Bây giờ tôi thấy làm thế nào nó vẫn hiển thị các liên kết tượng trưng, ​​có thể là các thư mục. Liên kết tượng trưng luôn bắt đầu bằng một chữ cái l, như trong liên kết.

Thay đổi lệnh để lọc cho a -. Điều này chỉ nên để lại các tập tin thông thường:

ls -lS | grep '^-'

Trên hệ thống của tôi, điều này chỉ hiển thị các tập tin thông thường.

cập nhật 3:

Để thêm đệ quy, tôi sẽ để lại việc sắp xếp các dòng cho sortlệnh và bảo nó sử dụng cột thứ 5 để sắp xếp.

ls -lR | grep '^-' | sort -k 5 -rn

-rncó nghĩa là Đảo ngược và số để có được các tệp lớn nhất ở trên cùng. Mặt trái của lệnh này là nó không hiển thị đường dẫn đầy đủ của các tệp.

Nếu bạn cần đường dẫn đầy đủ của các tệp, hãy sử dụng một cái gì đó như thế này:

find . -type f  -exec du -h {} + | sort -r -h

Các findlệnh sẽ đệ quy tìm tất cả các file trong tất cả các thư mục con của .và cuộc gọi du -h(có nghĩa là sử dụng đĩa -humanreadable ) và sau đó sắp xếp các đầu ra một lần nữa. Nếu find/ sortkhông hỗ trợ của bạn -h, thay thế bằng du -ksort -rn. Lưu ý rằng kích thướcviệc sử dụng đĩa không giống nhau.


5
ducung cấp cho việc sử dụng đĩa khác với kích thước tập tin. Với (GNU) du -h, sắp xếp số sẽ không hoạt động (bạn sẽ cần -htùy chọn GNU để sắp xếp). xargs mong đợi một danh sách các từ có thể được trích dẫn làm đầu vào để nó không hoạt động nếu tên tệp chứa khoảng trắng hoặc ký tự được trích dẫn.
Stéphane Chazelas

1
Tôi thấy rằng -S không giảm thứ tự kích thước, còn thứ tự tăng dần thì sao?
demongolem

3
Theo dõi @ StéphaneChazelas, điều này hiệu quả với tôi : find . -type f -print0 | xargs -0 du -h | sort -rh. Nếu bạn chỉ muốn nói 30 tệp lớn nhất : find . -type f -print0 | xargs -0 du -h | sort -rh | head -n 30.
dùng7543

Chào! Bạn có thể vui lòng giải thích + |cú pháp trong + | sort -r -h?
Victor


25

Bạn có thể sử dụng một cái gì đó như tìm và sắp xếp.

find . -type f -ls | sort -r -n -k7

( -lstùy chọn này không phải là tiêu chuẩn nhưng được tìm thấy trong nhiều triển khai tìm kiếm, không chỉ với GNU. Trong GNU find và các tùy chọn khác, nó hiển thị một cái gì đó tương tự ls -livới một vài ngoại lệ, ví dụ, các tệp có ACL không được đánh dấu +)

Nếu tên tệp có thể chứa các ký tự dòng mới, với GNU find và GNU sort:

find . -type f -ls -printf '\0' | sort -zk7rn | tr -d '\0'

Giả định cột "nhóm" này (từ -ls) không chứa bất kỳ khoảng trắng nào (do đó tham số -k 7), nhưng không nhất thiết phải như vậy.
kolistivra

1
Tại sao không chỉ đơn giản là tìm ... -print0 | sắp xếp -zk7rn0?
Andre de Miranda

10

Với zsh và GNU ls:

ls -ldU -- **/*(.OL)

Trường hợp (.OL)vòng loại toàn cầu , .để chỉ chọn các tệp thông thường , OLđể đảo ngược thứ tự theo độ dài (kích thước tệp, o theo thứ tự tăng dần, Ogiảm dần).

(lưu ý rằng các phiên bản cũ hơn của zsh có vấn đề với kích thước tệp trên 2 ^ 32).

Một số hệ điều hành có giới hạn về kích thước của danh sách đối số được truyền cho một lệnh. Trong những trường hợp đó, bạn cần:

autoload -U zargs
zargs ./**/*(.OL) -- ls -ldU

Nếu bạn chỉ muốn danh sách các tệp chứ không phải đầu ra chi tiết, chỉ cần làm:

print -rl -- **/*(.OL)

Nếu bạn muốn bao gồm các tệp ẩn (có tên bắt đầu bằng dấu chấm, ngoại trừ ...) và tìm kiếm trong các thư mục ẩn, hãy thêm vào Dvòng loại toàn cầu:

print -rl -- **/*(.DOL)

những gì hiện .OLlàm gì? Đó có phải là một phần của lệnh không?
alpha_989

@ alpha_989, xem chỉnh sửa
Stéphane Chazelas

Cảm ơn đã giải thích, Stephane .. Tuy nhiên, vì một số lý do .. lệnh không hoạt động trên máy trạm của tôi .. Tôi đang sử dụng ls (GNU coreutils) 8.25zsh 5.1.1 (x86_64-ubuntu-linux-gnu). Nó chỉ hoạt động cho các phiên bản nhất định lszsh?
alpha_989

@ alpha_989, theo cách nào nó không hoạt động cho bạn? Nó hoạt động với tôi với các phiên bản tương tự và không có gì trong mã đó sẽ không hoạt động trong các phiên bản từ 15 năm trước.
Stéphane Chazelas

9

Liệt kê các tệp theo kích thước tăng dần sẽ là:

ls -lSr

Các tùy chọn là:

  • l: dài, hiển thị chi tiết người dùng, nhóm, các thuộc tính khác, ngày, v.v.
  • S: danh sách đơn hàng theo kích thước (giảm dần theo mặc định)
  • r: đảo ngược thứ tự niêm yết

Bạn có muốn giải thích các tùy chọn để cải thiện chất lượng của câu trả lời?
Rui F Ribeiro

6

Nói rằng "các tệp có thể xuất hiện ở bất cứ đâu trong một thư mục nhất định" ngụ ý rằng bạn muốn đệ quy xuống tất cả các thư mục (thư mục) trong thư mục bắt đầu (thư mục). Đây là những gì findcó nghĩa là để làm:

find . -type f -exec ls -lSd {} +

Điều này "tìm thấy" tất cả các tệp trong thư mục làm việc hiện tại ( .). Đối với mỗi tệp được tìm thấy, một lsquy trình được chạy để sắp xếp các đối tượng được tìm thấy theo thứ tự kích thước. Dấu +chấm hết cho các -execnguyên nhân khiến nhiều đối số được truyền dưới dạng danh sách ls. Trừ khi thư mục (thư mục) của bạn chứa một số lượng tệp rất lớn, bạn nên có một danh sách (và do đó một quá trình được chia rẽ), dẫn đến kết quả mà bạn mong muốn.


1
điều này thật tuyệt vì nó cho phép bạn sử dụng công cụ sửa đổi -h trên ls để hiển thị kích thước tệp đẹp
shmish111

4

Danh sách tập tin hiển thị theo thứ tự ngược lại: ls -lSrh

Đối với thứ tự tăng dần: ls -lSh


1
+1 để sử dụng cờ -h cho đầu ra thân thiện với con người.
tính toán

2

Tôi đã viết một cái gì đó đến mức này một thời gian trở lại. Bạn có thể chuyển một đối số để chỉ định số lượng tệp cần liệt kê hoặc chỉ nhập big, trong trường hợp bạn nhận được 10.

big () { 
    NUM_FILES=10;
    if [ $1 ]; then
        NUM_FILES=$1;
    fi;
    du | sort -nr | head -n $NUM_FILES
}

2

Hãy thử những điều này, nó hoạt động tốt cho tôi.

$ find /home/san -type f -printf '%s %p\n'| sort -nr | head -n 10

# find /root -type f -exec ls -lS {} + | head -n 10 | awk '{ print $5, $9 }'

Câu trả lời không hoàn hảo nhưng hoạt động ở một mức độ nào đó

$ ls -lS |grep  '^-' | head -n 6 

1
awk hoạt động tốt nếu tên tệp không chứa bất kỳ khoảng trắng nào.
Eir Nym

có .. sử dụng 'sed' và thay thế không gian bằng dấu gạch dưới? nếu điều đó có ích
Sand1512

Không, tôi sử dụng sedđể cắt đầu ra
Eir Nym

1

Thêm vào câu trả lời của delh và bình luận của Stéphane Chazelas ...

find -print0kết hợp với xargs -0thêm hỗ trợ cho khoảng trống / dấu cách / whatnots.

du -h | sort -rn không sắp xếp đúng giữa các bội byte khác nhau, ví dụ 1.1M sẽ hiển thị sau 128K, sai.

sort -rh (--human-number-sort) đảm nhiệm việc đó, nhưng nó chỉ hoạt động trên phiên bản của GNU.

Các lệnh dưới đây sẽ cung cấp đầu ra mong muốn.

Có thể đọc được bằng con người, trên sắp xếp của GNU / Linux:

find . -type f -print0 | xargs -0 du -h | sort -rh

Theo đơn vị kilobyte, trên BSD / OSX / loại khác:

find . -type f -print0 | xargs -0 du -k | sort -rn

Đối với BSD / OSX, cũng xem https://unix.stackexchange.com/a/188375/82895 .


1

Là một biến thể của câu hỏi ban đầu, nếu bạn muốn xem kích thước tích lũy của các tệp trong thư mục con:

#!/bin/bash
find ${1:-.} -maxdepth 1 -type d -exec du -sm {} \; | sort -nr

Các kích thước sẽ được hiển thị bằng Megabyte ( min du -sm). Các giá trị khác được chấp nhận du-kcho kilobyte, -gcho gigabyte. Không thể sử dụng -hđể hiển thị có thể đọc được bởi vì nó sẽ phá vỡ sắp xếp.

Đây là phiên bản sử dụng sedđể nối thêm Mcho megabyte:

find ${1:-.} -maxdepth 1  -type d  -exec du -sm {} \; | sort -nr | sed -E 's/^([0-9]+)/\1M/g'

Thư mục để hiển thị được đặt thông qua ${1:-.}đó sẽ sử dụng đối số dòng lệnh đầu tiên nếu được cung cấp hoặc sử dụng thư mục hiện tại nếu được gọi mà không có đối số.

LƯU Ý: Điều này có thể mất nhiều thời gian với rất nhiều tệp. Tùy chọn -type dsẽ chỉ liệt kê các thư mục con và loại trừ các tệp trong thư mục hiện tại; nếu bạn cũng muốn xem các tập tin trong thư mục hiện tại thì hãy loại bỏ nó.

Lưu ý: bạn có thể muốn sử dụng ncduthay thế có sẵn trong hầu hết các repos linux (trên ubfox / debian apt install ncdu) cũng như trên osx ( brew install ncdu).

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.