Làm thế nào để tìm tệp lớn nhất trong một thư mục và các thư mục con của nó?


102

Chúng tôi chỉ bắt đầu một lớp UNIX và đang học nhiều lệnh Bash. Nhiệm vụ của chúng tôi liên quan đến việc thực hiện các lệnh khác nhau trên một thư mục cũng có một số thư mục trong đó.

Tôi biết cách liệt kê và đếm tất cả các tệp thông thường từ thư mục gốc bằng cách sử dụng:

find . -type l | wc -l

Nhưng tôi muốn biết phải đi đâu từ đó để tìm tệp lớn nhất trong toàn bộ thư mục. Tôi đã thấy điều gì đó liên quan đến một dulệnh, nhưng chúng tôi chưa học được điều đó, vì vậy, trong danh mục những điều chúng tôi đã học, tôi cho rằng chúng ta cần bằng cách nào đó kết nối nó với ls -tlệnh.

Và thứ lỗi cho tôi nếu 'biệt ngữ' của tôi không đúng, tôi vẫn đang quen với nó!


2
Nếu bạn biết một lệnh, nhưng không chắc chắn về cách sử dụng nó, hãy thử nhập manvà tiếp theo là lệnh mà bạn quan tâm. Trên đó sẽ xuất hiện một mục nhập thủ công tuyệt vời cho lệnh đó (nhấn qđể quay lại dòng lệnh).
Dunes

Câu trả lời:


126

Trích dẫn từ liên kết này-

Nếu bạn muốn tìm và in ra 10 tên tệp lớn nhất (không phải thư mục) trong một thư mục cụ thể và các thư mục con của nó

$ find . -printf '%s %p\n'|sort -nr|head

Để hạn chế tìm kiếm trong thư mục hiện tại, hãy sử dụng "-maxdepth 1" với find.

$ find . -maxdepth 1 -printf '%s %p\n'|sort -nr|head

Và để in 10 "tệp và thư mục" lớn nhất hàng đầu:

$ du -a . | sort -nr | head

** Sử dụng "head -n X" thay vì "head" duy nhất ở trên để in các tệp lớn nhất X (trong tất cả các ví dụ trên)


1
Tại sao "du -a. | Sort -nr | head" trả về gấp đôi số KB so với kích thước tệp thực?
xxjjnn

6
Ah, bạn cần phải thêm tùy chọn 'k' hoặc nó cho thấy bội số của 512 byte chứ không phải là của 1024. du -ak
xxjjnn

2
đối với cái đầu tiên, làm cách nào để bạn có được kích thước ở định dạng con người có thể đọc được?
Bluz

@Bluz Tôi muốn thử thay thế '%s %p\n'với '%p\n'và thêm |xargs ls -lhđến cùng
Duncan X Simpson

6
Các giải pháp đầu tiên đã không làm việc trên OS X đối với tôi, vì vậy tôi đã kết thúc bằng một hack nhanh chóng để lọc ra các thư mục từ các giải pháp thứ ba: du -am . | sort -nr | grep '\..*\.' | head. Các mlà kích thước tập tin hiển thị bằng megabyte và sử dụng grepđường dây chương trình với ít nhất hai chấm, đầu tiên là ở ./trong con đường, thứ hai là trong phần mở rộng tập tin, ví dụ .mov.
psmith

63

Để tìm 25 tệp hàng đầu trong thư mục hiện tại và các thư mục con của nó:

find . -type f -exec ls -al {} \; | sort -nr -k5 | head -n 25

Điều này sẽ xuất ra 25 tệp hàng đầu bằng cách sắp xếp dựa trên kích thước của tệp thông qua lệnh "sort -nr -k5".

Tương tự nhưng với kích thước tệp có thể đọc được của con người:

find . -type f -exec ls -alh {} \; | sort -hr -k5 | head -n 25


10
find . -type f | xargs ls -lS | head -n 1

đầu ra

-rw-r--r--  1 nneonneo  staff  9274991 Apr 11 02:29 ./devel/misc/test.out

Nếu bạn chỉ muốn tên tệp:

find . -type f | xargs ls -1S | head -n 1

Điều này tránh sử dụng awkvà cho phép bạn sử dụng bất kỳ cờ nào bạn muốn ls.

Cảnh báo trước . Vì xargscố gắng tránh xây dựng các dòng lệnh quá dài, điều này có thể không thành công nếu bạn chạy nó trên một thư mục có nhiều tệp vì lskết thúc thực thi nhiều lần. Đây không phải là một vấn đề không thể vượt qua (bạn có thể thu thập kết head -n 1quả từ mỗi lệnh lsgọi, và chạy ls -Slại, lặp lại cho đến khi bạn có một tệp duy nhất), nhưng nó thực hiện phần nào cách tiếp cận này.


tôi xin lỗi xargs, tôi đã bỏ bê bạn +1
Steve

2
để xử lý tên tập tin với không gian, sử dụngfind . -type f -print0 | xargs -0 ls -lS | head -n 1
rymo

Điều này tìm thấy các tệp lớn nhất chỉ trong lô đầu tiên xargsđã được thực thi. Để khắc phục nó thêm sắp xếp: find . -type f -print0 | xargs -0 ls -lS | sort -rk 5 | head -n 10. Làm việc trên OSX cho tôi.
psmith

10

Không có lệnh đơn giản nào có sẵn để tìm ra các tệp / thư mục lớn nhất trên hệ thống tệp Linux / UNIX / BSD. Tuy nhiên, kết hợp ba lệnh sau (sử dụng đường dẫn), bạn có thể dễ dàng tìm ra danh sách các tệp lớn nhất:

# du -a /var | sort -n -r | head -n 10

Nếu bạn muốn đầu ra con người có thể đọc được nhiều hơn, hãy thử:

$ cd /path/to/some/var
$ du -hsx * | sort -rh | head -10

Ở đâu,

  • Var là thư mục bạn muốn tìm kiếm
  • tùy chọn du command -h: hiển thị kích thước ở định dạng con người có thể đọc được (ví dụ: 1K, 234M, 2G).
  • tùy chọn du command -s: chỉ hiển thị tổng số cho mỗi đối số (tóm tắt).
  • tùy chọn du command -x: bỏ qua các thư mục trên các hệ thống tệp khác nhau.
  • tùy chọn lệnh sort -r: đảo ngược kết quả của các phép so sánh.
  • Tùy chọn lệnh sort -h: so sánh các số có thể đọc được của con người. Đây chỉ là tùy chọn sắp xếp GNU cụ thể.
  • head command -10 OR -n 10 option: hiển thị 10 dòng đầu tiên.

Tôi thích lệnh thứ 2 hơn nhưng trên osx, không có tùy chọn -h cho phiên bản sắp xếp được cài đặt. Nên dành cho mac: du -hsx * | sắp xếp -rn | head -10
Yann VR

1
Yêu thương lệnh thứ hai đó! Tốt nhất trong số tất cả những cái tôi đã thử - Tôi sẽ lưu nó sau.
CodeMouse92

Giải thích rõ ràng chi tiết về lệnh +1
Harish

8

Điều này liệt kê các tệp một cách đệ quy nếu chúng là các tệp bình thường, được sắp xếp theo trường thứ 7 (có kích thước trong findđầu ra của tôi ; hãy kiểm tra tệp của bạn) và chỉ hiển thị tệp đầu tiên.

find . -type f -ls | sort +7 | head -1

Tùy chọn đầu tiên findlà đường dẫn bắt đầu cho tìm kiếm đệ quy. Một-loại ftìm kiếm các tệp thông thường. Lưu ý rằng nếu bạn cố gắng phân tích cú pháp này dưới dạng tên tệp, bạn có thể không thành công nếu tên tệp chứa khoảng trắng, dòng mới hoặc các ký tự đặc biệt khác. Các tùy chọn sortcũng khác nhau tùy theo hệ điều hành. Tôi đang sử dụng FreeBSD.

Một giải pháp "tốt hơn" nhưng phức tạp hơn và nặng hơn sẽ là duyệt findqua các thư mục, nhưng có lẽ sử dụng statđể lấy thông tin chi tiết về tệp, sau đó có thể sử dụng awkđể tìm kích thước lớn nhất. Lưu ý rằng đầu ra của statcũng phụ thuộc vào hệ điều hành của bạn.


1
Đối số +7có nghĩa là để làm gì? Trên máy tính của tôi sắp xếp chỉ phàn nàn rằng nó không thể tìm thấy một tệp được gọi +7.
Dunes

@Dunes - Như tôi đã nói, hãy kiểm tra trang người đàn ông sorttrên hệ thống của bạn. Tôi đang sử dụng OS X 10.4 vào lúc này, trong đó việc sử dụng bắt nguồn từ loại của FreeBSD : sort [-cmus] [-t separator] [-o output-file] [-T tempdir] [-bdfiMnr] [+POS1 [-POS2]] [-k POS1[,POS2]] [file...]... Lưu ý +POS [-POS2]. Điều này cũng hoạt động trong các phiên bản hiện tại của FreeBSD.
ghoti

2
Có vẻ như bạn có một chương trình sắp xếp khác với tôi. Đây là trang người dùng cho chương trình sắp xếp của tôi - linux.die.net/man/1/sort Để điều này hoạt động trên máy của tôi, bạn sẽ cần sử dụng rõ ràng -kví dụ: arg. sort -k 7. chỉnh sửa: bởi OSX 10.5, trang người đàn ông để sắp xếp dường như đã thay đổi thành phiên bản tôi có.
Dunes

1
@Dunes - Tất cả đều là GNU sắp xếp, nhưng các phiên bản khác nhau. Các [+POS1] [-POS2]ký hiệu chỉ là một một lớn hơn. Theo như tôi có thể nói, ký hiệu này vẫn được hỗ trợ bởi GNU sort hiện đại, mặc dù bây giờ tôi nhìn lại, nó dường như đã bị loại bỏ khỏi trang sort man sau khoảng phiên bản 5.1. Bạn có thể xem nó trong trang người đàn ông để sắp xếp cho FreeBSD 4.11 . Tôi đoán rằng tôi đã không đọc trang người đàn ông của sắp xếp kể từ trước khi FreeBSD 5.0 ​​được phát hành!
ghoti

Ngoài ra, hãy lưu ý rằng +POS1đếm các tham số sắp xếp từ 0, trong khi -k POS1đếm từ một.
ghoti

6

Thao tác này sẽ tìm tệp hoặc thư mục lớn nhất trong thư mục làm việc hiện tại của bạn:

ls -S /path/to/folder | head -1

Để tìm tệp lớn nhất trong tất cả các thư mục con:

find /path/to/folder -type f -exec ls -s {} \; | sort -nr | awk 'NR==1 { $1=""; sub(/^ /, ""); print }'

Tôi nghĩ rằng hành vi mặc định của ls là liệt kê các tệp trong các cột (tức là một số mục nhập trên mỗi dòng), vì vậy cách đầu tiên không chính xác chỉ tìm thấy tệp lớn nhất. Liên quan đến lệnh thứ hai của bạn, nó chỉ tìm thấy tệp lớn nhất trong thư mục nhất định chứ không phải các thư mục con của nó.
Dunes

@Dunes: Bạn nói đúng, lệnh đầu tiên có thể tìm thấy các thư mục, nhưng không phải do hành vi mặc định của ls. Trong thử nghiệm của tôi, -Scờ sẽ liệt kê một tệp trên mỗi dòng. Tôi đã sửa lệnh thứ hai. Hy vọng rằng bây giờ nó đã được chứng minh đầy đủ. Cảm ơn bạn.
Steve

4

Trên Solaris tôi sử dụng:

find . -type f -ls|sort -nr -k7|awk 'NR==1{print $7,$11}' #formatted

hoặc là

find . -type f -ls | sort -nrk7 | head -1 #unformatted

vì bất cứ điều gì khác được đăng ở đây không hoạt động. Điều này sẽ tìm thấy tệp lớn nhất trong $PWDvà các thư mục con.


2

Hãy thử một lớp lót sau (hiển thị top 20 tệp lớn nhất):

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

hoặc (kích thước con người có thể đọc được):

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

Hoạt động tốt trong Linux / BSD / OSX so với các câu trả lời khác, vì -printftùy chọn của find không tồn tại trên OSX / BSD và statcó các thông số khác nhau tùy thuộc vào hệ điều hành. Tuy nhiên, lệnh thứ hai để làm việc trên OSX / BSD đúng cách (như sortkhông có -h), cài đặt sorttừ coreutilshoặc remove -htừ lsvà sử dụng sort -nrđể thay thế.

Vì vậy, những bí danh này rất hữu ích để có trong tệp rc của bạn :

alias big='du -ah . | sort -rh | head -20'
alias big-files='ls -1Rhs | sed -e "s/^ *//" | grep "^[0-9]" | sort -hr | head -n20'

Điều này chỉ hiển thị tên tệp mà không có đường dẫn, vì vậy không thực sự giúp tìm được tệp lớn nhất.
psmith

Đối với tôi trên đầu tôi có thực sự các file lớn nhất, nhưng cuối cùng điều này không đưa cho tôi tập tin chính xác
Borislav Markov

2

Hãy thử lệnh sau:

find /your/path -printf "%k %p\n" | sort -g -k 1,1 | awk '{if($1 > 500000) print $1/1024 "MB" " " $2 }' |tail -n 1 

Điều này sẽ in tên và kích thước tệp lớn nhất và hơn 500M. Bạn có thể di chuyển if($1 > 500000), và nó sẽ in tệp lớn nhất trong thư mục.


1

du -aS /PATH/TO/folder | sort -rn | head -2 | tail -1

hoặc là

du -aS /PATH/TO/folder | sort -rn | awk 'NR==2'


0

Tập lệnh này đơn giản hóa việc tìm kiếm các tệp lớn nhất cho các hành động tiếp theo. Tôi giữ nó trong thư mục ~ / bin và đặt ~ / bin vào $ PATH của tôi.

#!/usr/bin/env bash
# scriptname: above
# author: Jonathan D. Lettvin, 201401220235

# This finds files of size >= $1 (format ${count}[K|M|G|T], default 10G)
# using a reliable version-independent bash hash to relax find's -size syntax.
# Specifying size using 'T' for Terabytes is supported.
# Output size has units (K|M|G|T) in the left hand output column.

# Example:
#   ubuntu12.04$ above 1T
#   128T /proc/core

# http://stackoverflow.com/questions/1494178/how-to-define-hash-tables-in-bash
# Inspiration for hasch: thanks Adam Katz, Oct 18 2012 00:39
function hasch() { local hasch=`echo "$1" | cksum`; echo "${hasch//[!0-9]}"; }
function usage() { echo "Usage: $0 [{count}{k|K|m|M|g|G|t|T}"; exit 1; }
function arg1() {
    # Translate single arg (if present) into format usable by find.
    count=10; units=G;  # Default find -size argument to 10G.
    size=${count}${units}
    if [ -n "$1" ]; then
        for P in TT tT GG gG MM mM Kk kk; do xlat[`hasch ${P:0:1}`]="${P:1:1}"; done
        units=${xlat[`hasch ${1:(-1)}`]}; count=${1:0:(-1)}
        test -n "$units" || usage
        test -x $(echo "$count" | sed s/[0-9]//g) || usage
        if [ "$units" == "T" ]; then units="G"; let count=$count*1024; fi
        size=${count}${units}
    fi
}
function main() {
    sudo \
        find / -type f -size +$size -exec ls -lh {} \; 2>/dev/null | \
        awk '{ N=$5; fn=$9; for(i=10;i<=NF;i++){fn=fn" "$i};print N " " fn }'
}

arg1 $1
main $size

0

Đó là cách khá đơn giản để làm điều đó:

ls -l | tr -s " " " " | cut -d " " -f 5,9 | sort -n -r | head -n 1***

Và bạn sẽ nhận được điều này: 8445 examples.desktop


Những gì được 1***nghĩa vụ phải làm lúc kết thúc? Tôi nhận được lỗi "không tìm thấy kết quả phù hợp" cho đối số đó.
user4815162342

0

Giải pháp Linux: Ví dụ: bạn muốn xem tất cả các tệp / danh sách thư mục của thư mục home (/) của bạn theo kích thước tệp / thư mục ( Thứ tự giảm dần ).

sudo du -xm / | sắp xếp -rn | hơn


0

Để liệt kê tệp lớn hơn trong một thư mục

ls -sh /pathFolder | sort -rh | head -n 1

Đầu ra của ls -shlà một dạng xem có kích thước svà con người có hthể hiểu được về số kích thước tệp.

Bạn có thể sử dụng ls -shS /pathFolder | head -n 1. Lớn hơn Stừ lsđã sắp xếp thứ tự danh sách từ các tệp lớn hơn đến các tệp nhỏ hơn nhưng kết quả đầu tiên là tổng của tất cả các tệp trong thư mục đó. Vì vậy, nếu bạn chỉ muốn liệt kê tệp lớn hơn, một tệp, bạn cần phải head -n 2và kiểm tra ở "kết quả dòng thứ hai" hoặc sử dụng ví dụ đầu tiên với ls sort head.


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.