Làm thế nào để liệt kê các tệp đệ quy và sắp xếp chúng theo thời gian sửa đổi?


13

Làm cách nào để liệt kê tất cả các tệp trong một thư mục theo cách đệ quy và sắp xếp đầu ra theo thời gian sửa đổi?

Tôi thường sử dụng ls -lhtcnhưng nó không tìm thấy tất cả các tệp đệ quy. Tôi đang sử dụng Linux và Mac.

ls -l trên Mac OS X có thể cung cấp

-rw-r--r--    1 fsr  user      1928 Mar  1  2011 foo.c
-rwx------    1 fsr  user      3509 Feb 25 14:34 bar.c

trong đó phần ngày không nhất quán hoặc liên kết, do đó, một giải pháp phải tính đến điều này.

Giải pháp một phần

stat -f "%m%t%Sm %N" ./* | sort -rn | head -3 | cut -f2-

hoạt động, nhưng không đệ quy.


Tôi sẽ giả định rằng bạn đang sử dụng Linux, nhưng bạn nên xác định rõ ràng hệ điều hành của mình trong câu hỏi hoặc tốt nhất là dưới dạng thẻ.
EBGreen

Câu trả lời:


2

Đây là một phương pháp sử dụng statnhư @ johnshen64 đề xuất

find . -type f -exec stat -f "%m%t%Sm %N" '{}' \; | sort -rn | head -20 | cut -f2-

find "$PWD" -type f -exec stat -f $'%m\t%N' '{}' \; | sort -rn | cut -f2-sẽ chỉ in các đường dẫn tuyệt đối của các tệp trên OS X.
Lri

statbạn đang sử dụng phiên bản nào? định dạng của bạn ở trên không làm việc cho tôi. Tôi đã phải sử dụng như sau : find . -type f -exec stat --printf "%Y\t%y %N\n" '{}' \; | sort -rn | cut -f2-. Đây là vớistat (GNU coreutils) 8.23
user84207

12

Sử dụng find's -printfvà phân loại dựa theo định dạng ngày tháng hợp lý:

find -type f -printf '%T+\t%p\n' | sort -n

Điều này sẽ giảm thiểu các quá trình dĩa và do đó là nhanh nhất.

Ví dụ nếu bạn không thích phần thứ hai phân đoạn (thường không được triển khai trong hệ thống tệp):

find -type f -printf '%T+\t%p\n' | sed 's/\.[[:digit:]]\{10\}//' | sort -n
find -type f -printf '%T+\t%p\n' | cut --complement -c 20-30 | sort -n

EDIT: Tiêu chuẩn findtrên Mac không có -printf. Nhưng không khó để cài đặt GNU find trên Mac (cũng thấy liên kết đó để biết thêm thông tin liên quan đến khả năng tương thích Mac / Linux và xargs).


0

find .sẽ có thể nhận được tất cả các tập tin. Một cái gì đó như thế này:

find . -exec ls -dl '{}' \; | sort -k 6,7

Bạn cần điều chỉnh nó cho bạn cần.


Tôi cũng cho rằng đó là linux, như EBGreen đã nói, ls là bí danh trong windows PS, vì vậy bạn cần sử dụng đối tượng sort và nhận các mục con theo cách đệ quy nếu đó là trường hợp nhưng ý tưởng là như vậy.
johnshen64

Nó có thực sự hoạt động chính xác khi ngày đôi khi bỏ lỡ phần năm, trên Mac không?
qazwsx

bạn đã đúng, hiển thị ngày cho các tập tin gần đây sẽ làm rối tung mọi thứ. thay vào đó, bạn cần sử dụng stat để có được định dạng chính xác trong trường hợp đó. Các tập tin của tôi đều rất cũ nên lệnh hoạt động tốt, đó là lý do tại sao tôi đã thêm mệnh đề điều chỉnh :-)
johnshen64

@ johnshen64: lstrên Linux có một --time-formattùy chọn bạn có thể sử dụng để đảm bảo rằng cả ngày tệp gần đây và cũ hơn đều được hiển thị ở cùng định dạng.
RedGrittyBrick

ah cảm ơn, bạn đã đúng, chỉ cần không sử dụng nó. đó là đơn giản hơn nhiều so với sử dụng stat. nó được gọi là - phong cách thời gian tôi nghĩ.
johnshen64

0

Câu trả lời này cho một câu hỏi tương tự trên trang web Unix Stack Exchange đã giúp tôi vì tôi đang sử dụng zsh:

Cách liệt kê các tệp được sắp xếp theo ngày sửa đổi theo cách đệ quy (không có lệnh stat!)


Đây thực sự là một bình luận và không phải là một câu trả lời cho câu hỏi ban đầu. Bạn luôn có thể nhận xét về bài đăng của riêng bạn và khi bạn có đủ danh tiếng, bạn sẽ có thể nhận xét về bất kỳ bài đăng nào . Xin vui lòng đọc tại sao tôi cần 50 danh tiếng để bình luận? Tôi có thể làm gì thay thế?
DavidPostill
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.