POSIX mengatakan ini tentang tanggal di ls
-l
daftar ong:
The <date and time>
lapangan harus memuat tanggal yang sesuai dan timestamp dari ketika file terakhir diubah. Di lokal POSIX, bidang harus sama dengan output dari perintah tanggal berikut:
date "+%b %e %H:%M"
... jika file telah dimodifikasi dalam enam bulan terakhir, atau:
date "+%b %e %Y"
Mempertimbangkan hal ini, dan memastikan bahwa jika ada baris baru dalam nama file, mereka diblender dengan benar dengan opsi yang juga ditentukan POSIX ls -q
, relatif mudah untuk menyiapkan regex untuk ls
hasil tanpa find
sama sekali:
d=$(date "+%b %e") y=$(date --date=yesterday "+%b %e")
echo "$d" "$y"
###OUTPUT###
Jul 5 Jul 4
grep
untuk itu dan Anda hanya akan mengembalikan garis yang berisi string yang mewakili tanggal hari ini atau kemarin. Perintah berikut menambah sedikit itu:
ls -alRcq | sed "1H;/^-/!{/./d;N;h};/$d\|$y/!d;x;/\n/p;g"
ls
opsi terdiri dari:
-a
kembalikan semua file dalam direktori - termasuk yang dimulai dengan a .dot
-l
daftar panjang
-R
daftar semua direktori anak secara rekursif
-c
menampilkan waktu modifikasi daripada waktu akses
-q
mengembalikan shell glob ?
daripada karakter yang tidak dapat dicetak atau \t
ab dalam nama file
Hasil tersebut diteruskan ke |pipe
file sed
yang hanya cocok:
- Baris kosong sebelum nama path dan baris berikut
- Baris yang dimulai dengan
-
(d
dengan kata lain - bukan untuk direktori) yang juga berisi date
.
- Itu tidak mencetak garis pathname meskipun kecuali direktori yang mereka beri nama sebenarnya berisi file yang telah Anda filter.
Outputnya terlihat seperti ini:
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
Ya, itu bahkan bekerja dengan LS_COLORS
- yang mungkin merupakan prioritas rendah untuk Anda cron
tentu saja, tetapi, hei pilihan Anda terbuka.
Bagaimanapun, ini menawarkan beberapa keuntungan signifikan dibandingkan beberapa solusi lain yang mungkin.
Pertama-tama find
+ ls
melibatkan banyak pemanggilan - ini hanya melibatkan satu ls
proses tunggal , dan inilah mengapa ia mampu mengurutkan segala sesuatu dengan andal - yang dilakukan secara default - dan sort
juga dibuat tambahan.
Solusi apa pun yang melibatkan find
dan sort
dan ls
cukup banyak melakukan semua pekerjaan dua kali. ls
dan find
keduanya akan menyelesaikan setiap pathname dan stat
setiap file. ls
dan sort
keduanya akan mengurutkan semua hasil. Mungkin lebih baik menggunakan satu saja ls
.
Maka tentu saja ada date
dan sed
sebagian dari jawaban ini. Yang penting untuk dicatat tentang itu adalah Anda melakukan bagian yang sulit dan mendapatkan regex pertama - dan hanya sekali - dan setelah itu Anda hanya memangkas satu daftar hasil daripada mengatakan, dapatkan hasil, dapatkan hasil, hasilkan hasil, hasilkan sortir dan hasil sortir.
Ini tidak melanggar nama file yang mengandung baris baru, karena solusi lain mungkin akan melakukannya. Solusi ini memang memiliki peringatan sendiri - yang saya jelaskan selanjutnya - tetapi mereka kecil dan mudah ditangani. Menurut pendapat saya, ini adalah solusi paling kuat di sini.
Ada dua kasus di mana perintah di atas dapat menyebabkan masalah. Yang pertama melibatkan ?
gumpalan dalam nama file - sementara itu sudah merupakan solusi yang lebih kuat daripada yang ditawarkan di sini, dan kemungkinan bahwa Anda akan menemukan ?
sama sekali cukup kecil sendiri, ada kemungkinan menyelesaikan gumpalan tersebut dapat cocok dengan lebih dari satu nama file. Silakan lihat ini untuk informasi lebih lanjut tentang hal ini.
Kemungkinan lain melibatkan false positive - misalnya jika Anda memiliki nama file yang benar-benar cocok dengan date
string yang kami cari grep
tetapi itu tidak benar-benar dimodifikasi pada salah satu hari itu. Saya tidak mengandalkan itu menjadi masalah, tetapi, jika itu, tanyakan tentang hal itu dan saya mungkin dapat membantu Anda membuat regex lebih spesifik untuk menangani hal ini.
ls -ls **/*(.)