Một lưu ý về độ tin cậy:
Vì ký tự dòng mới có giá trị như bất kỳ tên tệp nào, nên bất kỳ giải pháp nào dựa trên các dòng như head
/ tail
dựa trên đều thiếu sót.
Với GNU ls
, một tùy chọn khác là sử dụng --quoting-style=shell-always
tùy chọn và một bash
mảng:
eval "files=($(ls -t --quoting-style=shell-always))"
((${#files[@]} > 0)) && printf '%s\n' "${files[0]}"
(thêm -A
tùy chọn vào ls
nếu bạn cũng muốn xem xét các tệp ẩn).
Nếu bạn muốn giới hạn các tệp thông thường (bỏ qua các thư mục, fifos, thiết bị, liên kết tượng trưng, ổ cắm ...), bạn cần phải sử dụng GNU find
.
Với bash 4.4 hoặc mới hơn (for readarray -d
) và GNU coreutils 8.25 hoặc mới hơn (for cut -z
):
readarray -t -d '' files < <(
LC_ALL=C find . -maxdepth 1 -type f ! -name '.*' -printf '%T@/%f\0' |
sort -rzn | cut -zd/ -f2)
((${#files[@]} > 0)) && printf '%s\n' "${files[0]}"
Hoặc đệ quy:
readarray -t -d '' files < <(
LC_ALL=C find . -name . -o -name '.*' -prune -o -type f -printf '%T@%p\0' |
sort -rzn | cut -zd/ -f2-)
Tốt nhất ở đây sẽ là sử dụng zsh
và vòng loại toàn cầu của nó thay vì bash
để tránh tất cả những rắc rối này:
Tập tin mới nhất trong thư mục hiện tại:
printf '%s\n' *(.om[1])
Bao gồm những cái ẩn:
printf '%s\n' *(D.om[1])
Thứ hai mới nhất:
printf '%s\n' *(.om[2])
Kiểm tra tuổi tập tin sau khi phân giải symlink:
printf '%s\n' *(-.om[1])
Đệ quy:
printf '%s\n' **/*(.om[1])
Ngoài ra, với hệ thống hoàn thành ( compinit
và đồng) được bật, Ctrl+Xmtrở thành trình hoàn thành mở rộng sang tệp mới nhất.
Vì thế:
vi Ctrl+Xm
Sẽ khiến bạn chỉnh sửa tệp mới nhất (bạn cũng có cơ hội xem tệp nào trước khi nhấn Return).
vi Alt+2Ctrl+Xm
Đối với tập tin mới nhất thứ hai.
vi * .cCtrl+Xm
cho c
tập tin mới nhất .
vi * (.)Ctrl+Xm
cho tệp thông thường mới nhất (không phải thư mục, cũng không phải fifo / thiết bị ...), v.v.
watch -n1 'ls -Art | tail -n 1'
- hiển thị các tệp cuối cùng