POSIX ma do powiedzenia na temat dat na ls
-l
liście ong:
<date and time>
Pole zawiera odpowiednią datę i znacznik czasu, kiedy plik był ostatnio modyfikowany. W ustawieniach narodowych POSIX, pole powinno odpowiadać wyjściu następującego polecenia date:
date "+%b %e %H:%M"
... jeśli plik został zmodyfikowany w ciągu ostatnich sześciu miesięcy lub:
date "+%b %e %Y"
Biorąc to pod uwagę i upewniając się, że jeśli w nazwie pliku znajdują się nowe wiersze, są one odpowiednio globowane za pomocą również ls -q
opcji określonej w POSIX , stosunkowo łatwo jest przygotować wyrażenie regularne dla ls
wyniku bez find
:
d=$(date "+%b %e") y=$(date --date=yesterday "+%b %e")
echo "$d" "$y"
###OUTPUT###
Jul 5 Jul 4
grep
w tym celu zwracane będą tylko wiersze zawierające ciągi reprezentujące dzisiejsze lub wczorajsze daty. Następujące polecenie trochę to dodaje:
ls -alRcq | sed "1H;/^-/!{/./d;N;h};/$d\|$y/!d;x;/\n/p;g"
ls
opcje składają się z:
-a
zwróć wszystkie pliki w katalogu - w tym te, które zaczynają się na .dot
-l
długa lista
-R
rekurencyjnie wypisz wszystkie katalogi potomne
-c
wyświetla czas modyfikacji, a nie czas dostępu
-q
zwraca nazwę globu powłoki ?
zamiast \t
znaków niedrukowalnych lub znaków ab w nazwie pliku
Wyniki są przekazywane do |pipe
pliku, do sed
którego pasuje tylko:
- Pusty wiersz poprzedzający nazwę ścieżki i następujący wiersz
- Linie zaczynające się od
-
(innymi słowy - nie d
dla katalogu), które również zawierają twój date
.
- Nie drukuje jednak wierszy ścieżki, chyba że katalog, którego nazwa zawiera, zawiera pliki, które przefiltrowałeś.
Dane wyjściowe wyglądają następująco:
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
Tak, to nawet działa z LS_COLORS
- co jest prawdopodobnie niskim priorytetem dla ciebie cron
, ale, hej, twoje opcje są otwarte.
W każdym razie oferuje to pewne znaczące zalety w porównaniu z innymi możliwymi rozwiązaniami.
Po pierwsze find
+ ls
obejmuje wiele wywołań - dotyczy to tylko jednego ls
procesu i dlatego jest w stanie niezawodnie sortować wszystko - co robi domyślnie - i dlatego sort
jest również pomocniczy.
Każde rozwiązanie obejmujące find
a sort
i ls
jest dość dużo robi wszystko z pracy dwa razy. ls
i find
rozpozna każdą ścieżkę i stat
każdy plik. ls
i sort
oba posortują wszystkie wyniki. Prawdopodobnie najlepiej jest po prostu użyć singla ls
.
Potem oczywiście są date
i sed
części tej odpowiedzi. Ważną rzeczą do zapamiętania jest to, że wykonujesz trudną część i najpierw otrzymujesz wyrażenie regularne - i tylko raz - a następnie przycinasz tylko jedną listę wyników, zamiast mówić, uzyskiwać wyniki, uzyskiwać wyniki, sortować wyniki i sortować wyniki.
Nie wpływa to na nazwy plików zawierające znaki nowej linii, podobnie jak inne rozwiązania. To rozwiązanie ma swoje własne zastrzeżenia - które wyjaśnię dalej - ale są niewielkie i łatwe do rozwiązania. Moim zdaniem jest to najbardziej niezawodne rozwiązanie tutaj.
Istnieją dwa przypadki, w których powyższe polecenie może powodować problemy. Pierwszy dotyczy ?
globów w nazwach plików - chociaż jest to już bardziej niezawodne rozwiązanie niż jakiekolwiek inne oferowane tutaj, a prawdopodobieństwo, że się ?
w ogóle natkniesz, jest wystarczająco małe samo w sobie, istnieje możliwość rozwiązania tych globów może pasować do więcej niż jednej nazwy pliku. Zobacz to, aby uzyskać więcej informacji na ten temat.
Inna możliwość wiąże się z fałszywym pozytywem - na przykład jeśli masz nazwę pliku faktycznie pasującą do date
ciągu, którego szukamy, grep
ale nie została ona faktycznie zmodyfikowana w żadnym z tych dni. Nie liczę na to, że jest to problem, ale jeśli tak, zapytaj o to i prawdopodobnie pomogę ci sprecyzować wyrażenie regularne, aby sobie z tym poradzić.
ls -ls **/*(.)