it-mot-dan-vi.com

Liệt kê các tệp lớn hơn {size} được sắp xếp theo ngày

Tôi muốn giải quyết vấn đề 'liệt kê 10 tệp gần đây nhất trong thư mục hiện tại trên 20MB'.

Với ls Tôi có thể làm:

ls -Shal |head

để có được 10 tệp lớn nhất và:

ls -halt |head

để có được top 10 tập tin gần đây nhất

Với tìm tôi có thể làm:

find . -size +20M

Để liệt kê tất cả các tệp trên 20 MB trong thư mục hiện tại (và thư mục con mà tôi không muốn).

Có cách nào để liệt kê mười tệp gần đây nhất trên một kích thước nhất định, tốt nhất là sử dụng ls không?

29
EoghanM

Tùy chọn 'thư mục hiện tại' cho find-maxdepth 1. Toàn bộ dòng lệnh cho nhu cầu của bạn là:

find . -maxdepth 1 -type f -size +20M -print0 | xargs -0 ls -Shal | head

hoặc là

find . -maxdepth 1 -type f -size +20M -print0 | xargs -0 ls -halt | head
25
Rajish

Lưu ý: Điều này sẽ hoạt động cho GNU-find, nhưng không phải mọi tìm kiếm khác.

find . -maxdepth 1 -size +20M -printf "%[email protected] %f\n" | 
    sort -nr | head -n 20 | sed 's/[^ ]\+ //'

Bắt đầu như @Rajish, nhưng sử dụng lệnh printf từ find để chỉ định định dạng đầu ra. Có 3 định dạng liên quan đến thời gian, atime, ctimemtime - %T là dành cho mtime, %A%C dành cho các định dạng khác.

@ là chỉ định khung thời gian tính bằng giây kể từ Epoch. %f là cho tên tệp, \n cho một dòng mới giữa 2 tệp.

Sau đó, sắp xếp theo số theo thứ tự đảo ngược sẽ cho các tệp trẻ nhất trước tiên và chúng tôi lấy 20 dòng¹ với head.

Cuối cùng, sed được sử dụng để loại bỏ thông tin thời gian.

¹) vì head hoạt động theo từng dòng, một tệp duy nhất có hơn 20 dòng mới trong tên, hơi bất thường, nhưng không bị cấm, có thể làm hỏng đầu ra nếu nó thuộc 20 kết quả khớp đầu tiên. Nếu bạn tình cờ có những tập tin như vậy, vui lòng cố gắng loại bỏ chúng - tốt, để thay đổi tên của chúng. Chúng thường sẽ là một vấn đề cho các kịch bản đơn giản.

8
user unknown

Zsh's vòng loại toàn cầ làm cho điều này trở nên dễ dàng. Các . vòng loại chỉ chọn các tệp thông thường, Lm+20 chọn các tệp có ít nhất 20 MB cộng với một byte dài; để bao gồm các tệp dài chính xác 20 MB, hãy sử dụng L+20971519. Sau đó om sắp xếp bằng cách giảm thời gian sửa đổi và [1,10] hạn chế mở rộng trong 10 trận đầu tiên. Bạn vẫn cần -t tùy chọn để ls nếu bạn muốn liệt kê các tệp theo ngày; hoặc bạn có thể truyền các tệp cho một số lệnh khác (đầu tiên trẻ nhất). Để chuyển các tệp sang một lệnh khác với tệp cũ nhất trước tiên, hãy sử dụng Om để sắp xếp bằng cách tăng thời gian sửa đổi và [-10,-1] để trích xuất 10 trận đấu gần nhất.

ls -ltr -- *(.Lm+20om[1,10])
echo *(.Lm+20Om[-10,-1])

Tôi nghĩ rằng đây có thể là một cách tốt hơn để giải quyết vấn đề ...

find . -maxdepth 1 -type f -size +20M -exec ls -Shal {} \+ | head

Để loại bỏ bất kỳ lỗi nào trong khi tìm cách truy cập các tệp mà bạn không có quyền đọc, bạn có thể muốn thêm

find . -maxdepth 1 -type f -size +20M -exec ls -Shal {} \+ 2> /dev/null | head 
2
Dominic Williams

Điều này sẽ chỉ in 10 tệp được chỉ định, bất kể ký tự dòng mới được nhúng trong tên tệp. Nó sử dụng hệ thống tệp inodes

cd "$1"
for i in $(find . -maxdepth 1 -type f -size +20M -printf "%[email protected]\t%i\n" \ 
           | sort -nr | head | cut -f 2)
do
  ls -l "$(find . -inum $i)"
done
1
Peter.O

Cảm ơn tất cả các câu trả lời. Những gì tôi đã đi là như sau:

ls -halt | grep "M " |head

Mặc dù nó bỏ qua 20 Megabyte để ủng hộ bất cứ thứ gì trên một megabyte (và dưới một gigabyte), thật dễ dàng để ghi nhớ và bảo tồn yếu tố con người có thể đọc được của các tệp.

0
EoghanM