2009-07-15 25 views
32

Ví dụ, tôi có một hệ thống tệp lớn làm đầy nhanh hơn dự kiến. Vì vậy, tôi tìm kiếm những gì đang được thêm vào:tổng kích thước của nhóm tệp được chọn với 'find'

find /rapidly_shrinking_drive/ -type f -mtime -1 -ls | less 

Và tôi thấy, rất nhiều thứ. Hàng ngàn tập tin của sáu bảy loại. Tôi có thể nêu ra một loại và đếm chúng:

find /rapidly_shrinking_drive/ -name "*offender1*" -mtime -1 -ls | wc -l 

nhưng những gì tôi thực sự muốn là để có thể để có được tổng kích thước trên đĩa của những tập tin này:

find /rapidly_shrinking_drive/ -name "*offender1*" -mtime -1 | howmuchspace 

Tôi mở để một Perl lót cho điều này, nếu ai đó có một, nhưng tôi sẽ không sử dụng bất kỳ giải pháp có liên quan đến một kịch bản nhiều dòng, hoặc File :: Tìm.

Trả lời

55

Lệnh du cho bạn biết về cách sử dụng đĩa. sử dụng ví dụ cho trường hợp cụ thể của bạn:

find rapidly_shrinking_drive/ -name "offender1" -mtime -1 -print0 | du --files0-from=- -hc | tail -n1 

(Trước đây tôi đã viết du -hs, nhưng trên máy tính của tôi mà dường như bỏ qua find 's đầu vào và thay vào đó tóm tắt các kích thước của PT.)

+0

Rất tốt. Mặc dù, hãy nhớ rằng từ khóa tàn bạo để 'tìm' ("--files0-from =") có thể không thực sự dễ dàng hơn việc nhớ chuỗi 'awk'. –

+1

Sử dụng phiên bản 'du' 8.13 sau đây cho tôi kết quả tương tự:' du -ch/rapid_shrinking_drive/* offender1 * | tail -n1' – jason

+2

Máy của tôi không thích tùy chọn '--files0-from ='. ; -/ –

11

Darn, Stephan202 là đúng. Tôi không nghĩ về du -s (tóm tắt), vì vậy thay vào đó tôi đã sử dụng awk:

find rapidly_shrinking_drive/ -name "offender1" -mtime -1 | du | awk '{total+=$1} END{print total}' 

Tôi thích câu trả lời khác tốt hơn, và nó gần như chắc chắn hiệu quả hơn.

+2

Thay thế bằng cách sử dụng - trong tìm kiếm: 'tìm quick_shrinking_drive/-name" offender1 "-mtime -1 -exec du {} \; | awk '{total + = $ 1} END {print total}' ' – Sylvain

+1

là nó có thể chuyển đổi số đầu ra cuối cùng thành nhiều định dạng dễ đọc hơn như 103M không? – Zen

-1

Bạn cũng có thể sử dụng ls -l để tìm kích thước của chúng, sau đó awk để trích xuất các kích thước:

find /rapidly_shrinking_drive/ -name "offender1" -mtime -1 | ls -l | awk '{print $5}' | sum 
+0

sai. ls -l là không cần thiết. – ghostdog74

+0

Nếu bạn định làm theo cách này, bạn cần sử dụng xargs – spookypeanut

6

với GNU tìm,

find /path -name "offender" -printf "%s\n" | awk '{t+=$1}END{print t}' 
+0

+1 để đề cập đến việc tìm kiếm GNU rõ ràng. (Để xấu nó là ít cầm tay theo cách đó). – Hennes

1

Tôi đã thử tất cả các lệnh này nhưng không có may mắn. Vì vậy, tôi đã tìm thấy một này mà mang lại cho tôi một câu trả lời:

find . -type f -mtime -30 -exec ls -l {} \; | awk '{ s+=$5 } END { print s }' 
3

tôi muốn thúc đẩy bình luận jason của trên để tình trạng của câu trả lời, bởi vì tôi tin rằng đó là sự ghi nhớ nhất (mặc dù không phải là chung nhất, nếu bạn thực sự phải có danh sách tệp được chỉ định bởi find):

$ du -hs *.nc 
6.1M foo.nc 
280K foo_region_N2O.nc 
8.0K foo_region_PS.nc 
844K foo_region_xyz.nc 
844K foo_region_z.nc 
37M ETOPO1_Ice_g_gmt4.grd_region_zS.nc 
$ du -ch *.nc | tail -n 1 
45M total 
$ du -cb *.nc | tail -n 1 
47033368 total 
Các vấn đề liên quan