Sắp xếp tệp theo kích thước đệ quy


78

Tôi cần tìm các tập tin lớn nhất trong một thư mục.
Làm cách nào để quét một thư mục đệ quy và sắp xếp nội dung theo kích thước?

Tôi đã thử sử dụng ls -R -S, nhưng điều này cũng liệt kê các thư mục.
Tôi cũng đã thử sử dụng find.


1
Bạn có muốn liệt kê các tệp trong mỗi thư mục con một cách riêng biệt hay bạn muốn tìm tất cả các tệp trong tất cả các thư mục con và liệt kê chúng theo kích thước bất kể chúng nằm trong thư mục con nào? Ngoài ra, ý nghĩa của "thư mục" và "thư mục" là gì? Bạn dường như đang sử dụng chúng để mô tả những thứ khác nhau.
terdon

Bạn đang nói rằng bạn chỉ muốn liệt kê các tệp trong một thư mục nhất định cũng như các tệp trong thư mục con của nó mà không hiển thị chỉ các thư mục con? Hãy thử và làm sạch câu hỏi của bạn, nó không rõ ràng lắm.
slm

Câu trả lời:


92

Bạn cũng có thể làm điều này với chỉ du. Để đảm bảo an toàn, tôi đang sử dụng phiên bản này của du:

$ du --version
du (GNU coreutils) 8.5

Tiếp cận:

$ du -ah ..DIR.. | grep -v "/$" | sort -rh

Phân tích cách tiếp cận

Lệnh du -ah DIRsẽ tạo một danh sách tất cả các tệp và thư mục trong một thư mục nhất định DIR. Các -hsẽ sản xuất kích thước có thể đọc được con người mà tôi thích. Nếu bạn không muốn chúng thì hãy bỏ công tắc đó. Tôi đang sử dụng head -6chỉ để giới hạn số lượng đầu ra!

$ du -ah ~/Downloads/ | head -6
4.4M    /home/saml/Downloads/kodak_W820_wireless_frame/W820_W1020_WirelessFrames_exUG_GLB_en.pdf
624K    /home/saml/Downloads/kodak_W820_wireless_frame/easyshare_w820.pdf
4.9M    /home/saml/Downloads/kodak_W820_wireless_frame/W820_W1020WirelessFrameExUG_GLB_en.pdf
9.8M    /home/saml/Downloads/kodak_W820_wireless_frame
8.0K    /home/saml/Downloads/bugs.xls
604K    /home/saml/Downloads/netgear_gs724t/GS7xxT_HIG_5Jan10.pdf

Đủ dễ dàng để sắp xếp nó từ nhỏ nhất đến lớn nhất:

$ du -ah ~/Downloads/ | sort -h | head -6
0   /home/saml/Downloads/apps_archive/monitoring/nagios/nagios-check_sip-1.3/usr/lib64/nagios/plugins/check_ldaps
0   /home/saml/Downloads/data/elasticsearch/nodes/0/indices/logstash-2013.04.06/0/index/write.lock
0   /home/saml/Downloads/data/elasticsearch/nodes/0/indices/logstash-2013.04.06/0/translog/translog-1365292480753
0   /home/saml/Downloads/data/elasticsearch/nodes/0/indices/logstash-2013.04.06/1/index/write.lock
0   /home/saml/Downloads/data/elasticsearch/nodes/0/indices/logstash-2013.04.06/1/translog/translog-1365292480946
0   /home/saml/Downloads/data/elasticsearch/nodes/0/indices/logstash-2013.04.06/2/index/write.lock

Đảo ngược nó, lớn nhất đến nhỏ nhất:

$ du -ah ~/Downloads/ | sort -rh | head -6
10G /home/saml/Downloads/
3.8G    /home/saml/Downloads/audible/audio_books
3.8G    /home/saml/Downloads/audible
2.3G    /home/saml/Downloads/apps_archive
1.5G    /home/saml/Downloads/digital_blasphemy/db1440ppng.zip
1.5G    /home/saml/Downloads/digital_blasphemy

Đừng cho tôi xem thư mục, chỉ các tập tin:

$ du -ah ~/Downloads/ | grep -v "/$" | sort -rh | head -6 
3.8G    /home/saml/Downloads/audible/audio_books
3.8G    /home/saml/Downloads/audible
2.3G    /home/saml/Downloads/apps_archive
1.5G    /home/saml/Downloads/digital_blasphemy/db1440ppng.zip
1.5G    /home/saml/Downloads/digital_blasphemy
835M    /home/saml/Downloads/apps_archive/cad_cam_cae/salome/Salome-V6_5_0-LGPL-x86_64.run

Nếu bạn chỉ muốn danh sách từ nhỏ nhất đến lớn nhất, nhưng 6 tệp vi phạm hàng đầu, bạn có thể đảo ngược công tắc sắp xếp, thả ( -r) và sử dụng tail -6thay vì head -6.

$ du -ah ~/Downloads/ | grep -v "/$" | sort -h | tail -6
835M    /home/saml/Downloads/apps_archive/cad_cam_cae/salome/Salome-V6_5_0-LGPL-x86_64.run
1.5G    /home/saml/Downloads/digital_blasphemy
1.5G    /home/saml/Downloads/digital_blasphemy/db1440ppng.zip
2.3G    /home/saml/Downloads/apps_archive
3.8G    /home/saml/Downloads/audible
3.8G    /home/saml/Downloads/audible/audio_books

14
Phần grep -v "/$"dường như không làm những gì bạn mong đợi, vì các thư mục không có dấu gạch chéo. Có ai biết làm thế nào để loại trừ các thư mục từ kết quả?
Jan Warchoł

@JanekWarchol - bạn đang sử dụng phiên bản nào của coreutils?
slm

Tôi đang trên 8.13. Nhưng dù sao, đầu ra trong câu trả lời của bạn cũng không có dấu vết /- ví dụ /home/saml/Downloads/audiblenhư dường như là một thư mục, nhưng nó không có dấu gạch chéo. Chỉ /home/saml/Downloads/có một dấu gạch chéo, nhưng đó có thể là do bạn đã viết nó bằng dấu gạch chéo khi chỉ định đối số ban đầu du.
Jan Warchoł

1
Điều này cũng tìm thấy các thư mục
ekerner

1
Đây không chỉ liệt kê các tệp, mà còn liệt kê các thư mục :(
Roman Gaufman

20

Nếu bạn muốn tìm tất cả các tệp trong thư mục hiện tại và các thư mục con của nó và liệt kê chúng theo kích thước của chúng (không xem xét đường dẫn của chúng) và giả sử không có tên tệp nào chứa ký tự dòng mới, với GNU find, bạn có thể làm điều này:

find . -type f -printf "%s\t%p\n" | sort -n

Từ man findtrên hệ thống GNU:

   -printf format
          True; print format  on  the  standard  output,
          interpreting  `\'  escapes and `%' directives.
          Field widths and precisions can  be  specified
          as  with the `printf' C function.  Please note
          that many of the  fields  are  printed  as  %s
          rather  than  %d, and this may mean that flags
          don't work as you  might  expect.   This  also
          means  that  the `-' flag does work (it forces
          fields to be  left-aligned).   Unlike  -print,
          -printf  does  not add a newline at the end of
          the string.  The escapes and directives are:

          %p     File's name.
          %s     File's size in bytes.

Từ man sort:

   -n, --numeric-sort
          compare according to string numerical value

Không may không hoạt động trên Mac, hiển thị: find: -printf: không rõ chính hoặc toán tử
Roman Gaufman

@RomanGaufman có, đó là lý do tại sao câu trả lời chỉ định GNU find. Nếu bạn cài đặt các công cụ GNU trên máy Mac, nó cũng sẽ hoạt động ở đó.
terdon

11

Hãy thử lệnh sau:

ls -1Rhs | sed -e "s/^ *//" | grep "^[0-9]" | sort -hr | head -n20

Nó sẽ liệt kê 20 tập tin lớn nhất trong thư mục hiện tại theo cách đệ quy.

Lưu ý: Tùy chọn -hcho sortkhông khả dụng trên OSX / BSD, vì vậy bạn đã cài đặt sorttừ coreutils(ví dụ: qua brew) và áp dụng đường dẫn bin cục bộ vào PATH, vd

export PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH" # Add a "gnubin" for coreutils.

Cách sử dụng khác:

ls -1Rs | sed -e "s/^ *//" | grep "^[0-9]" | sort -nr | head -n20

Đối với các thư mục lớn nhất sử dụng du, ví dụ:

du -ah . | sort -rh | head -20

hoặc là:

du -a . | sort -rn | head -20

3
Hoàn hảo, đây là giải pháp đầu tiên hoạt động trên Mac và không hiển thị các thư mục :) - cảm ơn bạn!
Roman Gaufman

Làm thế nào để lọc chỉ hiển thị tệp có số dòng> = X? (X = 0 cho ví dụ)
Ma trận

7

Điều này sẽ tìm thấy tất cả các tệp đệ quy và sắp xếp chúng theo kích thước. Nó in ra tất cả các kích thước tệp trong kb và làm tròn xuống để bạn có thể thấy các tệp 0 KB, nhưng nó đủ gần để sử dụng và hoạt động trên OSX.

find . -type f -print0 | xargs -0 ls -la | awk '{print int($5/1000) " KB\t" $9}' | sort -n -r -k1


cũng hoạt động trên Ubuntu 14.04!
David Lam

Danh sách này liệt kê các thư mục, không chỉ các tệp :(
Roman Gaufman

@RomanGaufman - cảm ơn bạn đã phản hồi! từ các thử nghiệm của tôi, find . -type ftìm thấy các tệp ... nó hoạt động theo cách đệ quy, bạn đúng, nhưng nó liệt kê tất cả các tệp mà nó tìm thấy, chứ không phải các thư mục
Brad

Xargs đã được sử dụng vào những năm 1980. Đó là một ý tưởng tồi kể từ năm 1989 khi execplus được giới thiệu bởi David Korn.
schily

5

Với zsh, bạn sẽ tìm thấy tệp lớn nhất (về kích thước rõ ràng như cột kích thước ở ls -lđầu ra, không phải sử dụng đĩa) với:

ls -ld -- **/*(DOL[1])

Đối với 6 cái lớn nhất:

ls -ld -- **/*(DOL[1,6])

Để sắp xếp những bởi kích thước tập tin, bạn có thể sử dụng ls's -Slựa chọn. Một số lstriển khai cũng có -Utùy chọn lskhông sắp xếp danh sách (vì nó đã được sắp xếp theo kích thước zshở đây).


3

Giải pháp đơn giản cho Mac / Linux bỏ qua các thư mục:

find . -type f -exec du -h {} \; | sort -h

2

Tương đương trong BSDhoặc OSX

$ du -ah simpl | sort -dr | head -6

0

Đây là một nhu cầu cực kỳ phổ biến vì nhiều lý do (tôi thích tìm bản sao lưu gần đây nhất trong một thư mục), và là một nhiệm vụ đơn giản đáng ngạc nhiên.

Tôi sẽ cung cấp một giải pháp Linux sử dụng các tiện ích find, xargs, stat, tail, awk và sort.

Hầu hết mọi người đã cung cấp một số câu trả lời duy nhất, nhưng tôi thích câu trả lời của tôi hơn vì nó xử lý đúng tên tệp và trường hợp sử dụng có thể dễ dàng thay đổi (sửa đổi chỉ số và sắp xếp đối số)

Tôi cũng sẽ cung cấp giải pháp Python cho phép bạn sử dụng chức năng này ngay cả trên Windows

Giải pháp dòng lệnh Linux

Trả về đệ quy toàn bộ danh sách các tệp chỉ từ một thư mục, được sắp xếp theo kích thước tệp

find . -type f -print0 | xargs -0 -I{} stat -c '%s %n' {} | sort -n

Tương tự như trước, nhưng lần này, trả lại tệp lớn nhất.

# Each utility is split on a new line to help 
# visualize the concept of transforming our data in a stream
find . -type f -print0 | 
xargs -0 -I{} stat -c '%s %n' {} | 
sort -n | 
tail -n 1 |
awk '{print $2}'

Cùng một mẫu chính xác, nhưng bây giờ chọn tệp mới nhất thay vì lớn nhất

# (Notice only the first argument of stat changed for new functionality!)
find . -type f -print0 | xargs -0 -I{} stat -c '%Y %n' {} | 
sort -n | tail -n 1 | awk '{print $2}'

Giải trình:

  1. find: Tìm đệ quy tất cả các tệp từ thư mục hiện tại và in chúng ra với một ký tự null
  2. xargs: tiện ích để thực thi các lệnh bằng cách sử dụng các đối số được cung cấp từ đầu vào tiêu chuẩn. Đối với mỗi dòng đầu ra, chúng tôi muốn chạy tiện ích stat trên tệp đó
  3. stat: Stat là một lệnh tuyệt vời xung quanh có rất nhiều trường hợp sử dụng. Tôi đang in ra hai cột, cột đầu tiên là kích thước khối (% s) và cột thứ hai là tên tệp (% n)
  4. sort: Sắp xếp kết quả với công tắc số. Vì đối số đầu tiên là một số nguyên, kết quả của chúng tôi sẽ được sắp xếp đúng
  5. tail: Chỉ chọn dòng đầu ra cuối cùng (vì danh sách được sắp xếp, đây là tệp lớn nhất!)
  6. awk: Chọn cột thứ hai chứa tên tệp và là tệp lớn nhất trong thư mục đệ quy.

Giải pháp Python

#!/usr/bin/env python
import os, sys
files = list()
for dirpath, dirname, filenames in os.walk(sys.argv[1]):
    for filename in filenames:
        realpath = os.path.join(dirpath, filename)
        files.append(realpath)
files_sorted_by_size = sorted(files, key = lambda x: os.stat(x).st_size)
largest_file = files_sorted_by_size[-1]
print(largest_file)

Kịch bản này mất nhiều thời gian hơn để giải thích, nhưng về cơ bản nếu bạn lưu nó dưới dạng tập lệnh, nó sẽ tìm kiếm thông qua đối số đầu tiên được cung cấp trên dòng lệnh và trả về tệp lớn nhất trong thư mục đó. Kịch bản không kiểm tra lỗi, nhưng nó sẽ cho bạn ý tưởng về cách tiếp cận vấn đề này trong Python, nó cung cấp cho bạn một cách độc lập nền tảng tốt để giải quyết vấn đề này.



0

Hãy thử lệnh bên dưới với tùy chọn sắp xếp để có các thư mục có kích thước theo thứ tự tăng dần

du -sh * | sort -sh


-1

Một cái gì đó hoạt động trên mọi nền tảng ngoại trừ AIX và HP-UX là:

find . -ls | sort +6 | tail
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.