EDIT: Tôi đoán bài đăng này không "không đặc biệt hữu ích" như tôi nghĩ. Đây là một giải pháp thực sự nhanh chóng, chỉ theo dõi tệp được sửa đổi gần đây nhất (thay vì sắp xếp toàn bộ danh sách các tệp):
find . -type f -printf '%T@ %p\n' | awk 'BEGIN { mostrecenttime = 0; mostrecentline = "nothing"; } { if ($1 > mostrecenttime) { mostrecenttime = $1; mostrecentline = $0; } } END { print mostrecentline; }' | cut -f2- -d ' '
Trải rộng trên nhiều dòng cho rõ ràng như sau:
find . -type f -printf '%T@ %p\n' | awk '
BEGIN { mostrecenttime = 0; mostrecentline = "nothing"; }
{
if ($1 > mostrecenttime)
{ mostrecenttime = $1; mostrecentline = $0; }
}
END { print mostrecentline; }' | cut -f2- -d ' '
Kết thúc EDIT
Không phải là một bài viết đặc biệt hữu ích nhưng vì 'sắp xếp' đang thảo luận về tốc độ, tôi nghĩ tôi muốn chia sẻ điều này.
sắp xếp các giải pháp và enzotib liên quan đến việc liệt kê tất cả các tệp trong thư mục với mtimes của họ và sau đó sắp xếp. Như bạn biết sắp xếp là không cần thiết để tìm tối đa. Việc tìm kiếm tối đa có thể được thực hiện trong thời gian tuyến tính nhưng việc sắp xếp mất n log (n) thời gian [Tôi biết sự khác biệt không nhiều, nhưng vẫn;)]. Tôi không thể nghĩ ra một cách gọn gàng để thực hiện điều này. [EDIT: Một cách gọn gàng (mặc dù trông bẩn) và triển khai nhanh được cung cấp ở trên.]
Điều tốt nhất tiếp theo - Để tìm tệp được chỉnh sửa gần đây nhất trong một thư mục, hãy tìm đệ quy tệp được chỉnh sửa gần đây nhất trong mỗi thư mục con cấp 1. Hãy để tập tin này đại diện cho thư mục con. Bây giờ sắp xếp các tệp cấp 1 cùng với các đại diện của thư mục con cấp 1. Nếu số lượng tệp cấp 1 và thư mục con của mỗi thư mục gần như là một hằng số, thì quá trình này sẽ mở rộng tuyến tính với tổng số tệp.
Đây là những gì tôi đã đưa ra để thực hiện điều này:
findrecent() { { find "$1" -maxdepth 1 -type f -exec stat -c "%y %n" {} + | sort -r | head -1 && find "$1" -mindepth 1 -maxdepth 1 -type d -exec findrecent {} \;; } | sort -r | head -1; }
findrecent .
Tôi chạy cái này và gặp một loạt find: findrecent: No such file or directory
lỗi. Lý do: -exec của find chạy trong một shell khác. Tôi đã thử xác định công cụ tìm kiếm trong .bashrc, .xsessionrc nhưng chúng không giúp được gì [Tôi đánh giá cao sự giúp đỡ ở đây]. Cuối cùng, tôi đã dùng đến việc đặt
#!/bin/bash
{ find "$1" -maxdepth 1 -type f -exec stat -c "%y %n" {} + | sort -r | head -1 && find "$1" -mindepth 1 -maxdepth 1 -type d -exec findrecent {} \;; } | sort -r | head -1;
trong một kịch bản được gọi findrecent
trong PATH của tôi và sau đó chạy nó.
Tôi chạy này, tiếp tục chờ đợi và không có đầu ra. Để chắc chắn rằng tôi đã không xử lý bất kỳ vòng lặp vô hạn nào, tôi đã sửa đổi tệp thành
#!/bin/bash
echo "$1" >&2
{ find "$1" -maxdepth 1 -type f -exec stat -c "%y %n" {} + | sort -r | head -1 && find "$1" -mindepth 1 -maxdepth 1 -type d -exec findrecent {} \;; } | sort -r | head -1;
và thử lại. Nó đã hoạt động - nhưng mất 1 phút 35 giây trên máy chủ của tôi - các giải pháp của sắp xếp và enzotib lần lượt mất 1,69, 1,95 giây!
Quá nhiều cho sự vượt trội của O (n) so với O (n log (n))! Chết tiệt bạn gọi chức năng trên cao! [Hay nói đúng hơn là tập lệnh gọi]
Nhưng tập lệnh này có quy mô tốt hơn các giải pháp trước đó và tôi cá rằng nó sẽ chạy nhanh hơn chúng trên ngân hàng bộ nhớ của google; D