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


27

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 lstô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 tin gần đây nhất trên một kích thước nhất định, tốt nhất là sử dụng lskhông?

Câu trả lời:


24

Tùy chọn 'thư mục hiện tại' 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

8

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 "%T@ %f\n" | 
    sort -nr | head -n 20 | sed 's/[^ ]\+ //'

Bắt đầu như @Rajish, nhưng sử dụng printflệnh từ findđể chỉ định định dạng đầu ra. Có 3 định dạng liên quan đến thời gian, atime, ctimemtime - %Tdành cho mtime %A%Cdà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. %fdành cho tên tệp, \ncho 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 thực hiện 20 dòng với head.

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

¹) kể từ khi headhoạt động theo từng dòng, một tệp 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 thuộc về 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.


1
Nếu bạn sử dụng file's -lslệnh, các ký tự đặc biệt sẽ được in như ký tự gạch chéo ngược thoát: find . -maxdepth 1 -size +20M -printf "%T@ " -ls | sort -nr | head -n 20 | sed 's/[^ ]\+ //'. Ngoài ra, định dạng sẽ như thế nào ls -l, EoghanM cũng được chỉ định -l.
manatwork

printfchỉ hoạt động cho các bản phân phối GNU cụ thể.
Brethlosze

%T+tạo các dấu thời gian có thể đọc được của con người giống như 2018-11-06+13:37:54.4606466460có thể sắp xếp theo sort(không có -n), xem: unix.stackexchange.com/questions/29899/ Kẻ
Ciro Santilli 改造

5

Vòng loại toàn cầu của Zsh làm cho điều này dễ dàng. Vòng .loại chỉ chọn các tệp thông thường, Lm+20chọ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 đó omsắ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 đầu tiên. Bạn vẫn cần -ttùy chọn lsnế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 kết quả khớp cuối cùng.

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

2

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 

1

Đ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 tininodes

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

-1

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.


4
Bạn không nên cố phân tích đầu ra ls, nó hiển thị cho bạn một đại diện của các tệp, không có gì hơn. Đối với tên tệp đơn giản, đầu ra hầu hết xảy ra tương đương với tên tệp, nhưng bạn không nên dựa vào nó.
Chris Xuống

Điều đó đúng, tôi chắc chắn, nhưng về mặt người dùng (và đầu ra không được truyền ở nơi khác), thì điều này dễ nhớ hơn vì nó có thể được kết hợp dễ dàng hơn từ các công cụ đơn giản đã biết tldp.org/LDP/GNU-Linux- Công cụ-Tóm tắt / html / c1089.htm
EoghanM
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.