POSIX có điều này để nói về ngày trong ls
-l
danh sách ong:
Các <date and time>
lĩnh vực phải có các ngày thích hợp và dấu thời gian khi các tập tin được sửa đổi lần cuối. Trong miền địa phương POSIX, trường sẽ tương đương với đầu ra của lệnh ngày sau:
date "+%b %e %H:%M"
... nếu tệp đã được sửa đổi trong sáu tháng qua, hoặc:
date "+%b %e %Y"
Cân nhắc điều này và đảm bảo rằng nếu có bất kỳ dòng mới nào trong tên tệp thì chúng được đặt đúng vị trí với ls -q
tùy chọn được chỉ định POSIX , việc chuẩn bị một biểu thức chính xác cho ls
kết quả mà không cần find
:
d=$(date "+%b %e") y=$(date --date=yesterday "+%b %e")
echo "$d" "$y"
###OUTPUT###
Jul 5 Jul 4
grep
cho điều đó và bạn sẽ chỉ trả lại các dòng có chứa các chuỗi đại diện cho ngày hôm nay hoặc ngày hôm qua. Lệnh sau thêm vào đó một chút:
ls -alRcq | sed "1H;/^-/!{/./d;N;h};/$d\|$y/!d;x;/\n/p;g"
ls
các tùy chọn bao gồm:
-a
trả về tất cả các tệp trong một thư mục - bao gồm cả những tệp bắt đầu bằng một .dot
-l
danh sách dài
-R
liệt kê đệ quy tất cả các thư mục con
-c
hiển thị thời gian sửa đổi thay vì thời gian truy cập
-q
trả về shell toàn cầu ?
thay vì các \t
ký tự ab không thể in hoặc ab trong tên tệp
Những kết quả đó được chuyển qua |pipe
tệp sed
chỉ khớp với:
- Dòng trống trước tên đường dẫn và dòng sau
- Các dòng bắt đầu bằng
-
(nói cách khác - không d
dành cho thư mục) cũng chứa của bạn date
.
- Nó không in các dòng tên đường dẫn trừ khi thư mục họ đặt tên thực sự chứa các tệp bạn đã lọc.
Đầu ra trông như thế này:
ls -alRcq --color=always |
sed "1H;/^-/!{/./d;N;h};/$d\|$y/!d;x;/\n/p;g"
###OUTPUT###
.:
-rw------- 1 mikeserv mikeserv 2086 Jul 4 10:52 .bash_history
-rw------- 1 mikeserv mikeserv 2657 Jul 4 15:20 .lesshst
-rw-r--r-- 1 mikeserv mikeserv 681 Jul 5 05:18 .zdirs
-rw------- 1 mikeserv mikeserv 750583 Jul 5 08:28 .zsh_history
-rw-r--r-- 1 mikeserv mikeserv 166 Jul 4 23:02 Terminology.log
-rw-r--r-- 1 mikeserv mikeserv 433568 Jul 4 13:34 shot-2014-06-22_17-10-16.jpg
-rw-r--r-- 1 mikeserv mikeserv 445192 Jul 4 13:34 shot-2014-06-22_17-11-06.jpg
./.cache/efreet:
-rw------- 1 mikeserv mikeserv 37325 Jul 4 22:51 desktop_localhost_C.eet
-rw------- 1 mikeserv mikeserv 37325 Jul 4 23:30 desktop_localhost_en_US.eet
-rw------- 1 mikeserv mikeserv 24090 Jul 4 22:51 desktop_util_localhost_C.eet
-rw------- 1 mikeserv mikeserv 24090 Jul 4 23:30 desktop_util_localhost_en_US.eet
-rw------- 1 mikeserv mikeserv 16037 Jul 4 23:30 icon_themes_localhost.eet
-rw------- 1 mikeserv mikeserv 3117 Jul 4 23:30 icons___efreet_fallback_localhost.eet
-rw------- 1 mikeserv mikeserv 768039 Jul 4 23:30 icons_gnome_localhost.eet
-rw------- 1 mikeserv mikeserv 18589 Jul 4 23:30 icons_hicolor_localhost.eet
./.config:
-rw-r--r-- 1 mikeserv mikeserv 30 Jul 4 19:10 pavucontrol.ini
./.config/chrome:
-rw-r--r-- 1 mikeserv mikeserv 94332179 Jul 4 13:36 conf.tar.lz4.bak
Vâng, nó thậm chí hoạt động với LS_COLORS
- có lẽ là ưu tiên thấp cho cron
khóa học của bạn , nhưng, hey các tùy chọn của bạn đang mở.
Trong mọi trường hợp, điều này cung cấp một số lợi thế đáng kể so với một số giải pháp có thể khác.
Ở vị trí đầu tiên find
+ ls
liên quan đến nhiều yêu cầu - điều này chỉ liên quan đến một ls
quy trình duy nhất và đây là lý do tại sao nó có thể sắp xếp một cách đáng tin cậy mọi thứ - theo mặc định - và do đó sort
cũng được thực hiện phụ trợ.
Bất kỳ giải pháp liên quan find
và sort
và ls
là khá nhiều làm tất cả các công việc hai lần. ls
và find
cả hai sẽ giải quyết mọi tên đường dẫn và stat
mọi tệp. ls
và sort
cả hai sẽ sắp xếp tất cả các kết quả. Nó có lẽ là tốt nhất thay vì chỉ sử dụng duy nhất ls
.
Sau đó, tất nhiên có date
và sed
một phần của câu trả lời này. Điều quan trọng cần lưu ý là bạn làm phần khó và lấy regex trước - và chỉ một lần - và sau đó bạn chỉ cắt một danh sách kết quả duy nhất thay vì nói, nhận kết quả, nhận kết quả, sắp xếp kết quả và sắp xếp kết quả.
Điều này không phá vỡ tên tập tin có chứa dòng mới, như các giải pháp khác có thể sẽ. Giải pháp này có những cảnh báo riêng - mà tôi sẽ giải thích tiếp theo - nhưng chúng chỉ trong vài phút và dễ dàng xử lý. Theo tôi, đây là giải pháp mạnh mẽ nhất ở đây.
Có hai trường hợp lệnh trên có thể gây ra sự cố cho bạn. Đầu tiên liên quan đến các khối ?
trong tên tập tin - trong khi đó nó đã là một giải pháp mạnh mẽ hơn bất kỳ giải pháp nào khác được cung cấp ở đây, và khả năng bạn sẽ gặp phải ?
tất cả là đủ nhỏ, có khả năng giải quyết các khối đó có thể khớp nhiều hơn một tên tệp. Xin vui lòng xem điều này để biết thêm thông tin về chủ đề này.
Khả năng khác liên quan đến dương tính giả - ví dụ nếu bạn có tên tệp thực sự khớp với date
chuỗi mà chúng tôi đang tìm kiếm grep
nhưng điều đó không thực sự được sửa đổi vào một trong những ngày đó. Tôi không tính đó là một vấn đề, nhưng, nếu có, hãy hỏi về nó và tôi có thể giúp bạn làm cho regex cụ thể hơn để xử lý việc này.
ls -ls **/*(.)