Tìm tập tin hoặc thư mục lớn nhất


10

Lệnh nào sẽ in kích thước của tất cả các tệp và thư mục trong thư mục tmp (bao gồm cả các tệp ẩn) và sắp xếp chúng theo kích thước từ lớn nhất đến nhỏ nhất ở định dạng có thể đọc được của con người (ví dụ 2 GB)?

Đầu ra có thể như sau:

file.mpg 2GB
file.avi 1.8GB
.backtup 1.7 GB (this is directory)

Tôi đã cố gắng sử dụng các lệnh lsdunhưng không thể tìm thấy các công tắc phù hợp.

Câu trả lời:


7

Đây là một sửa chữa nhanh chóng, sử dụng du + sort. Thử đi:

du -smc * | sort -n

Điều này sẽ bỏ qua các tập tin ẩn, nhưng đó là một sửa chữa dễ dàng khác:

du -smc .[^.] .??* * | sort -n

Điều này có thể gây ra cảnh báo về việc nếu một hoặc nhiều mẫu trên không khớp với tệp. Mẫu đầu tiên .[^.]khớp với tất cả tên tệp hai ký tự bắt đầu bằng. ngoại trừ .., mẫu thứ hai, .??*khớp với cả ba tên tệp trở lên bắt đầu bằng. và * khớp với tất cả các tệp không bắt đầu bằng. Đối với một danh sách phức tạp hơn như tìm tất cả các tệp lớn hơn X trên toàn bộ hệ thống tệp hoặc duy trì danh sách tăng trưởng hệ thống tệp, tôi có một số tập lệnh shell DIY tôi đã viết và có thể chia sẻ nếu bạn quan tâm.


Cảm ơn bạn. Tôi quan tâm đến kịch bản của bạn nếu bạn sẽ rất tốt bụng.
xralf

1
Sử dụng sort -nrnếu bạn muốn các giá trị lớn nhất trên đầu trang.
LawrenceC

3

Để liệt kê các tệp ở bất cứ đâu bên dưới /tmp, được sắp xếp theo kích thước:

find /tmp -type f -exec du -k {} + | sort -k1n -k2

Để liệt kê các tập tin và cây thư mục ngay bên dưới /tmp, được sắp xếp theo kích thước:

du -k /tmp/..?* /tmp/.[!.]* /tmp* 2>/dev/null | sort -k1n -k2

Để liệt kê tất cả các tệp và cây thư mục ở bất cứ đâu bên dưới /tmp, được sắp xếp theo kích thước:

du -ak /tmp | sort -k1n -k2

(Một ví dụ để minh họa sự khác biệt giữa ba lệnh: nếu có tệp /tmp/dir/file, danh sách lệnh đầu tiên /tmp/dir/file, danh sách thứ hai /tmp/dirvà danh sách thứ ba cả hai.)

Tất cả các lệnh trên hiển thị kích thước tính bằng kilobyte. Trong khi GNU du có thể xuất ra các kích thước có thể đọc được của con người (với các số nhân k, M, G, v.v.), thì việc sắp xếp chúng là một vấn đề khác. Các lõi GNU đủ gần đây (≥7.4) có thể làm điều đó: chỉ cần thay thế du -kbằng du -hsort -k1n -k2bằng sort -k1h -k2. Mặt khác, đây là một kịch bản awk thô để chuyển đổi sang kích thước hậu tố (làm tròn xuống); chỉ cần sortđầu ra ở trên vào nó.

awk -vFS='\t' -vOFS='\t' '{
    if ($1) $1 = substr($1,1,(length($1)-1)%3+1)
                 substr("kMGTPEZY",(length($1)-1)/3+1,1);
    print}'

Cảm ơn bạn. Các lệnh này rất hữu ích, nhưng tôi chỉ quan tâm đến các tệp và thư mục trực tiếp dưới tmp, không phải các tệp trong thư mục con
xralf

1
@xralf: Sau đó chỉ sử dụng hình thức dugọi thứ hai .
Gilles 'SO- ngừng trở nên xấu xa'

Có vẻ tốt, nhưng kết quả tốt hơn là với MB và GB như Forcefsck đã đăng.
xralf

3

Tôi đang sử dụng bí danh sau cho nó: alias ds='du -x --all --max-depth=1 . | sort -n'

Nó in kích thước của tất cả các tệp và thư mục con cấp 1 của thư mục hiện tại.


Đó là giải pháp ngắn đẹp, nhưng nó chỉ in các thư mục.
xralf

Ồ, xin lỗi, bạn nói đúng. Tôi chưa bao giờ phải đối mặt với vấn đề này với các tập tin. Tuy nhiên, tôi đã tìm thấy cách làm cho nó hoạt động với các tệp: bằng cách sử dụng --all swicth.
rvs

Giải pháp chính xác tuyệt vời. penguin359 có một chút tốt hơn vì nó hiển thị kích thước tính bằng MB. Cách tốt nhất sẽ là giải pháp của Forcefsck nhưng giải pháp của anh ta bỏ qua các thư mục có khoảng trắng.
xralf

1

Với phiên bản hiện tại của sắp xếp gnu (và mẫu tệp @ penguin359)

cd /tmp; du -sShc .[^.] .??* * | sort -h

Với phiên bản cũ hơn của loại

cd /tmp
foo=$(du -sShc .[^.] .??* *)
for u in K M G T; do
    echo "$foo" | egrep "^[0-9\.]+$u" | sort -n
done

EDIT: đã thêm tham số -Sdu để không bao gồm các thư mục con.


Tôi muốn không gian đĩa được sử dụng bởi các tệp và thư mục (tổng kích thước của dữ liệu bên trong) ngay dưới tmp (không phải thư mục con). Lệnh sort của tôi không có tùy chọn -h.
xralf

Tôi không chắc chắn 100% ý của bạn là gì, vì bạn đã chấp nhận câu trả lời với cùng lựa chọn mẫu tệp. Đã chỉnh sửa bài viết của tôi để không bao gồm các thư mục con. Nếu bạn muốn kích thước rõ ràng và không phải không gian đĩa thực tế được sử dụng, bạn có thể thêm --apparent-sizevào tham số du.
Forcefsck

Bây giờ nó hoạt động tốt đẹp. Tôi chỉ phải tìm GB và sau đó là MB, nhưng đó không phải là vấn đề.
xralf

Tôi đã có các chữ cái đơn vị theo thứ tự sai, bây giờ đã được sửa. Nếu bạn muốn thứ tự từ lớn đến nhỏ, hãy thay đổi thứ tự của các chữ cái đơn vị và thêm -r để sắp xếp.
Forcefsck

Tôi nhận thấy, nó quên in kích thước của thư mục (không có tiền tố)
xralf

0

CẬP NHẬT: Tôi đã loại bỏ các kịch bản trước đó. Đây là một phiên bản mới, sử dụng duawk ( phiên bản trước được sử dụng treesed)

Đây là đầu ra của: dusort ~/test 1

================
dir     4.10 KiB  /home/user/test/bdir
dir     4.98 KiB  /home/user/test/Kdir
dir   104.91 MiB  /home/user/test/Mdir
dir   587.47 MiB  /home/user/test/Gdir
dir   692.39 MiB  /home/user/test
================
 f      0    Byt  /home/user/test/new file
 f     42    Byt  /home/user/test/.hi   dd     en
================

Đây là kịch bản

units() { awk -v pfix="$1" \
  'BEGIN { yect=6  # Array element-count
    split("Byt KiB MiB GiB TiB PiB",lbl)
    for (i=1;i<=yect;i++) { val[i] = (2**(10*(i-1)))-1 } 
  }
  { yess=yect  # Array element-subscript
    while ( $1 < val[yess] ){ yess-- }
    num = $1 / (val[yess]+1)
    sub(/^[0-9]*\t*/,"")
    if (yess!=1) { printf "%s %8.2f %s  %s\n", pfix, num, lbl[yess], $0 }
    else        { printf "%s %5d    %s  %s\n", pfix, num, lbl[yess], $0 }
   }'
}
tdir="/tmp/$USER/$(basename $0)"
[[ ! -d "$tdir" ]] && mkdir -p "$tdir"
file="$tdir/$(date +%N)"
echo "================"
dirs="$file.dirs";   du --max-depth=$2 -b $1  >"$dirs" ; <"$dirs"  sort -n           | units "dir"
echo "================"
filz="$file.filz"; { du --max-depth=$2 -ab $1 ; cat "$dirs" ; } | sort -n | uniq -u  | units " f "
echo "================"
rm   "$file."* 
#

Khi bạn nói kích thước của tất cả các tệp và thư mục , bạn có nghĩa là không gian mà mỗi mục chiếm trên đĩa (ví dụ: trên hệ thống tệp Ubuntu ext4 của tôi , một thư mục trống chiếm 4k dung lượng đĩa và một tệp nhỏ hơn 4k chiếm 4k Chunk phân bổ tối thiểu là 4k) .. hoặc bạn có nghĩa là lượng dữ liệu trong mỗi tệp, ví dụ: 100 (byte) .. Và đối với các thư mục, bạn có muốn biết tổng số dữ liệu tệp trong thư mục đó không .. Nếu bạn muốn kích thước của dữ liệu trong các tập tin, sau đó treethực hiện điều đó. nếu bạn muốn không gian đĩa được sử dụng, thì duthực hiện điều đó ... ( treekhông phải là toàn bộ thư mục)
Peter.O

'du' là lựa chọn tốt hơn ... Tôi vừa nhận thấy man durằng nó cũng có thể báo cáo "kích thước tệp rõ ràng" .... The apparent size of a file is the number of bytes reported by wc -c 'trên các tệp thông thường, hay nói chung hơn là ls -l --block-size=1' or stat --format =% S'. Ví dụ: một tệp có chứa từzoo' with no newline would, of course, have an apparent size of 3.
Peter.O

Tôi muốn không gian đĩa được sử dụng bởi các tệp và thư mục (tổng kích thước dữ liệu bên trong) ngay dưới tmp (không phải thư mục con)
xralf

Tôi xin lỗi, tôi chưa ở giai đoạn kịch bản shell tôi có thể hiểu được nó, vì vậy tôi đã để nó cho người dùng khác quyết định câu trả lời tốt như thế nào. Cám ơn về công việc của bạn. Tôi sẽ nghiên cứu nó khi tôi tốt hơn.
xralf

0
find /tmp -exec du {} + | sort -nr | less 

hiển thị các tệp lớn nhất trước tiên, vì vậy bạn có thể quit ngay khi bạn thấy đủ.

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.