POSIX ma do powiedzenia na temat dat na ls -lliś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 -qopcji określonej w POSIX , stosunkowo łatwo jest przygotować wyrażenie regularne dla lswyniku bez find:
d=$(date "+%b %e") y=$(date --date=yesterday "+%b %e")
echo "$d" "$y"
###OUTPUT###
Jul 5 Jul 4
grepw 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
-qzwraca nazwę globu powłoki ?zamiast \tznaków niedrukowalnych lub znaków ab w nazwie pliku
Wyniki są przekazywane do |pipepliku, do sedktórego pasuje tylko:
- Pusty wiersz poprzedzający nazwę ścieżki i następujący wiersz
- Linie zaczynające się od
- (innymi słowy - nie ddla 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+ lsobejmuje wiele wywołań - dotyczy to tylko jednego lsprocesu i dlatego jest w stanie niezawodnie sortować wszystko - co robi domyślnie - i dlatego sortjest również pomocniczy.
Każde rozwiązanie obejmujące finda sorti lsjest dość dużo robi wszystko z pracy dwa razy. lsi findrozpozna każdą ścieżkę i statkażdy plik. lsi sortoba posortują wszystkie wyniki. Prawdopodobnie najlepiej jest po prostu użyć singla ls.
Potem oczywiście są datei sedczęś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 dateciągu, którego szukamy, grepale 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 **/*(.)