Có, bạn có thể làm điều này với GNU find
. Nếu tên tệp của bạn không chứa dòng mới, bạn có thể làm:
find -printf '%T@ %p\n' | sort -gk1,1
Giải trình
Các -printf
tùy chọn find
có thể in tất cả các loại thông tin. Trong trường hợp này, chúng tôi đang sử dụng:
%Tk File's last modification time in the format specified by
k, which is the same as for %A.
@ seconds since Jan. 1, 1970, 00:00 GMT, with fractional part.
%p File's name.
Vì vậy, %T@ %p\n
sẽ in thời gian sửa đổi của tệp tính bằng giây kể từ epoch ( %T@
), khoảng trắng và sau đó là tên tệp ( %p
).
Chúng sau đó được chuyển đến sort
được yêu cầu sắp xếp số ( -n
) trên trường đầu tiên ( -k1,1
).
Lưu ý rằng điều này sẽ trả về tất cả các tập tin và thư mục. Để giới hạn nó chỉ với các tệp thông thường (không có thư mục, tệp thiết bị, liên kết, v.v.) thêm -type f
vào find
lệnh của bạn .
Để có được ngày con người có thể đọc được, bạn có thể xử lý đầu ra bằng GNU date
:
find -printf '%T@ %p\t\n' | sort -gk1,1 |
perl -lne 's/([^ ]*)//;chomp($i=`date -d \@$1`); print "$i $_"'
Ở đây, perl
lệnh thay thế chuỗi ký tự không phải không gian đầu tiên (ngày) bằng chính nó được xử lý bởi GNU date
.
Ở trên sẽ thất bại cho tên tập tin có chứa dòng mới. Để đối phó với các dòng mới, sử dụng:
find -printf '%p\t%T@\0' | sort -zt$'\t' -nk2 | tr '\0' '\n'
Đó là điều tương tự ngoại trừ việc find
sẽ xuất ra \0
thay vì \n
ở cuối mỗi tên tệp. GNU sort
có thể xử lý đầu ra được phân tách bằng null để nó vẫn có thể sắp xếp chính xác. Lệnh cuối cùng tr
dịch \0
ngược lại \n
.