Tìm tệp cũ hơn X ngày và xuất chúng theo kích thước của chúng


8

Tôi đang cố gắng để các tệp cũ hơn một số ngày và liệt kê chúng theo thứ tự giảm dần dựa trên kích thước của chúng với tất cả thông tin của chúng (kích thước, đường dẫn đầy đủ, v.v. - một cái gì đó tương tự được cung cấp bởi ls).

Trong khi tôi có thể định vị các tệp cũ hơn bằng:

find . -mtime +10

Tôi không thể liệt kê các thông tin mong muốn.


vui lòng thêm thông tin distro và shell của bạn
lese

@lese: AIX 6.1; trong khi echo $ SHELL -> / usr / bin / ksh
user148335

Điều này nghe có vẻ như là một XYPro Hiệu ... bạn có thực sự, như bạn hỏi, cần TẤT CẢ các tệp theo thứ tự kích thước không? hoặc bạn (nhiều khả năng) đang tìm kiếm các tệp "cũ" (> 10 ngày) đủ lớn và chỉ cần 200 cái lớn nhất để quyết định xem cái nào bạn có thể xóa để tiết kiệm dung lượng? Trong trường hợp sau và vì bạn đang sử dụng AIX mà không có công cụ gnu nào, nên sự kết hợp của find (xuất tất cả các tệp> 10 ngày) và awk (giữ 200 tệp lớn nhất trong một mảng, sau đó xuất ra theo thứ tự) sẽ là của bạn đặt cược tốt nhất
Olivier Dulac

Câu trả lời:


8

Với điều kiện đường dẫn tệp của bạn không chứa các ký tự dòng mới:

find . -mtime +10 -printf "%s %n %m %u %g %t %p" \( \
  -type l -printf ' -> %l\n' -o -printf '\n' \) | sort -k1,1 -n

Xem findhướng dẫn , phần Actions.

  • %s Kích thước tệp theo byte.
  • %n Số lượng liên kết cứng đến tập tin.
  • %m Bit cho phép của tập tin (theo bát phân ).
  • %u Tên người dùng của tệp hoặc ID người dùng số nếu người dùng không có tên.
  • %g Tên nhóm của tệp hoặc ID nhóm số nếu nhóm không có tên.
  • %t Thời gian sửa đổi cuối cùng của tệp theo định dạng được trả về bởi ctimehàm C.
  • %p Tên tệp.
  • %l Đối tượng của liên kết tượng trưng (chuỗi trống nếu tệp không phải là liên kết tượng trưng).

BTW: Lưu ý rằng hướng dẫn POSIX find không chỉ định hầu hết các hành động trên.


1
Nó nói: find: 0652-017 -printf không phải là một tùy chọn hợp lệ.
dùng148335

đối với tôi điều này hoạt động và có vẻ như là một giải pháp khá sạch +1
lese

@ user148335, bạn không đề cập đến bản phân phối Linux nào bạn đang chạy. Có vẻ như bạn bị giới hạn trong đặc tả tìm POSIX , điều này khá hạn chế.
patryk.beza

1
@ patryk.beza Tôi đoán bạn đã nói chuyện với user148335
lese

AIX 6.1; trong khi echo $ SHELL -> / usr / bin / ksh
user148335

4

Lệnh này chỉ sử dụng các tính năng POSIX của findvà của ls:

find . -type f -mtime +10 -exec ls -lS {} +

Tuy nhiên, nó có thể gọi lsnhiều lần, nếu có một số lượng rất lớn các tệp trong thư mục hiện tại (hoặc thư mục con đệ quy) khớp với -mtime +10chính.

Tất nhiên, nếu nó gọi lsnhiều lần, việc sắp xếp sẽ chỉ được thực hiện trong mỗi lần lsthực hiện, không phải qua nhiều lần thực hiện.

Tuy nhiên, đối với số lượng tập tin hợp lý, đây có thể là lựa chọn tốt nhất của bạn.


Phiên bản cập nhật không phá vỡ với khoảng trắng trong tên
Miguel G

1
Nếu lschỉ được thông qua một đối số, có rất ít cách sắp xếp nó có thể làm với nó. Với +thay vì ;, điều đó sẽ tốt hơn, nhưng lsvẫn có thể kết thúc được gọi nhiều lần nếu có nhiều file.
Stéphane Chazelas

2
Đây là lệnh chính xác mà tôi đã đưa ra, vì vậy tôi đã thêm văn bản giải thích mà tôi sẽ đưa ra để đi cùng với nó.
tự đại diện

3

Với zsh:

ls -ldrS -- **/*(m+10)

Hoặc để tránh sắp xếp kép (theo tên theo zsh và theo kích thước theo ls):

ls -ldrS -- **/*(m+10oN) # disable zsh sorting

hoặc (nếu lshỗ trợ của bạn -Ucho chưa được sắp xếp):

ls -ldU -- **/*(m+10oL) # disable ls sorting and have zsh sort by size

Thêm Dvòng loại toàn cầu là bạn muốn xem các tập tin ẩn.


Điều này có hoạt động khi tên người dùng và nhóm chứa không gian?
roaima

@roaima, vâng. Tại sao nó không? Nó có thể phá vỡ cho E2BIG, mà bạn có thể làm việc xung quanh bằng cách sử dụng zargs.
Stéphane Chazelas

Vì bạn đã cung cấp nó, tôi nghi ngờ nó sẽ ổn, nhưng tôi cần hỏi :-)
roaima

1

Tôi nghĩ bạn có thể làm một cái gì đó tương tự như:

find . -type f -mtime +10 -print0 | sort -n -r -k1 | while IFS= read -r -d $'\0' line; do
    #echo "$line"
    ls -lS "$line"    
done

chú ý -Stham số của lslệnh:

-S sắp xếp theo kích thước tập tin


Sau khi giảm -d $ '\ 0' vì thông báo: $ \ 0: Đây không phải là số nhận dạng tôi đã quản lý để nhận đầu ra nhưng các tệp không được ghi giảm dần dựa trên kích thước của chúng
user148335

Sẽ phá vỡ khi bạn gặp một thư mục dưới /home/phphil. Hãy thửls -ld ...
roaima

@Roaima, còn việc dùng find . -type fthay thế thì sao?
lese

@lese Tôi đã thay đổi mã nhưng lệnh dường như ném hai lần mỗi tệp từ mỗi thư mục con. Ví dụ.
dùng148335

find ... -type fsẽ hoạt động, như sẽ thêm -dcờ vàols
roaima

1

thử cái này:

find ./ -type f -mtime +10 -exec ls -ln {} \; | sort -r -k 5 -g

Với tùy chọn -n, đó không phải là vấn đề vì tôi không liệt kê tên người dùng và tên nhóm mà thay vào đó là uid và gid
dervishe

0

Đối với một lớp lót dễ dàng hơn, bạn có thể sử dụng findtùy chọn -ls. Nó xuất hiện trong hầu hết các trường hợp kích thước tệp nằm ở cột thứ bảy của thông tin được liệt kê (vì vậy thay đổi 7ở cuối lệnh nếu thích hợp nếu không):

find . -type f -mtime +10 -ls | sort -n -r -k7

0

Một biến thể khác sẽ được sử dụng:

  • tìm (để tìm các tập tin phù hợp)
  • du (để hiển thị kích thước tệp tính bằng KB)
  • sort -n -r (viết tắt theo thứ tự giảm dần)

Đây là lệnh:

find . -type f -mtime +10 -exec du -k {} \; | sort -n -r
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.