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.
man ls
:-S sort by file size
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.
man ls
:-S sort by file size
Câu trả lời:
Đơ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:
-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 -r
chuyể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 sort
lệnh và bảo nó sử dụng cột thứ 5 để sắp xếp.
ls -lR | grep '^-' | sort -k 5 -rn
-rn
có 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 find
lệ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
/ sort
không hỗ trợ của bạn -h
, thay thế bằng du -k
và sort -rn
. Lưu ý rằng kích thước và việc sử dụng đĩa không giống nhau.
du
cung 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 -h
tù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.
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
.
+ |
cú pháp trong + | sort -r -h
?
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
( -ls
tù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 -li
vớ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'
Với zsh và GNU ls:
ls -ldU -- **/*(.OL)
Trường hợp (.OL)
là 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, O
giả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à ..
) và tìm kiếm trong các thư mục ẩn, hãy thêm vào D
vòng loại toàn cầu:
print -rl -- **/*(.DOL)
.OL
làm gì? Đó có phải là một phần của lệnh không?
ls (GNU coreutils) 8.25
và zsh 5.1.1 (x86_64-ubuntu-linux-gnu)
. Nó chỉ hoạt động cho các phiên bản nhất định ls
và zsh
?
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à:
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ì find
có 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 ls
quy 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 -exec
nguyê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.
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
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
}
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
sed
để cắt đầu ra
Thêm vào câu trả lời của delh và bình luận của Stéphane Chazelas ...
find -print0
kết hợp với xargs -0
thê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 .
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 ( m
in du -sm
). Các giá trị khác được chấp nhận du
là -k
cho kilobyte, -g
cho 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 M
cho 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 d
sẽ 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
ncdu
thay thế có sẵn trong hầu hết các repos linux (trên ubfox / debianapt install ncdu
) cũng như trên osx (brew install ncdu
).