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
.
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
.
Câu trả lời:
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
Lệnh du -ah DIR
sẽ 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 -h
sẽ 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 -6
chỉ để 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 -6
thay 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
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ả?
/
- ví dụ /home/saml/Downloads/audible
như 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
.
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 find
trê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
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 -h
cho sort
không khả dụng trên OSX / BSD, vì vậy bạn đã cài đặt sort
từ 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
Đ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
find . -type f
tì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
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 -S
lựa chọn. Một số ls
triển khai cũng có -U
tùy chọn ls
không sắp xếp danh sách (vì nó đã được sắp xếp theo kích thước zsh
ở đây).
Đâ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
find . -type f -print0 | xargs -0 -I{} stat -c '%s %n' {} | sort -n
# 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}'
# (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:
#!/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.
Biến thể của câu trả lời này từ một câu hỏi tương tự
find . -type f -exec du -ah {} + | sort -rh | more
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
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