POSIX hat Folgendes zu Terminen in einer ls
-l
Liste zu sagen :
Das <date and time>
Feld muss das Datum und den Zeitstempel der letzten Änderung der Datei enthalten. Im POSIX-Gebietsschema entspricht das Feld der Ausgabe des folgenden Datumsbefehls:
date "+%b %e %H:%M"
... wenn die Datei in den letzten sechs Monaten geändert wurde oder:
date "+%b %e %Y"
In Anbetracht dessen und um sicherzustellen, dass Zeilenumbrüche in einem Dateinamen mit der ebenfalls von POSIX angegebenen ls -q
Option ordnungsgemäß entfernt werden , ist es relativ einfach, einen regulären Ausdruck für ein ls
Ergebnis zu erstellen, ohne dass find
:
d=$(date "+%b %e") y=$(date --date=yesterday "+%b %e")
echo "$d" "$y"
###OUTPUT###
Jul 5 Jul 4
grep
dafür und Sie werden nur Zeilen zurückgeben, die die Zeichenfolgen enthalten, die entweder das heutige oder das gestrige Datum darstellen. Der folgende Befehl fügt dem ein wenig hinzu:
ls -alRcq | sed "1H;/^-/!{/./d;N;h};/$d\|$y/!d;x;/\n/p;g"
ls
Optionen bestehen aus:
-a
Alle Dateien in einem Verzeichnis zurückgeben - einschließlich der Dateien, die mit einem beginnen .dot
-l
lange Liste
-R
Listen Sie alle untergeordneten Verzeichnisse rekursiv auf
-c
Änderungszeit anstatt Zugriffszeit anzeigen
-q
Geben Sie das Shell-Glob zurück, ?
anstatt nicht druckbare oder \t
ab-Zeichen in einem Dateinamen
Diese Ergebnisse werden über die |pipe
Datei übertragen, für sed
die nur Folgendes zutrifft:
- Die leere Zeile vor einem Pfadnamen und die folgende Zeile
- Zeilen, die mit
-
(also nicht d
für Verzeichnisse) beginnen und auch Ihre enthalten date
.
- Die Pfadnamenzeilen werden jedoch nicht gedruckt, es sei denn, das von ihnen angegebene Verzeichnis enthält tatsächlich Dateien, nach denen Sie gefiltert haben.
Die Ausgabe sieht folgendermaßen aus:
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
Ja, es funktioniert sogar mit LS_COLORS
- was für Sie cron
natürlich wahrscheinlich eine niedrige Priorität hat , aber Ihre Optionen sind offen.
In jedem Fall bietet dies einige wesentliche Vorteile gegenüber einigen anderen möglichen Lösungen.
Erstens beinhaltet find
+ ls
mehrere Aufrufe - dies betrifft nur einen einzigen ls
Prozess, und deshalb ist es in der Lage, alles zuverlässig zu sortieren - was es standardmäßig tut - und wird daher sort
auch zur Nebensache gemacht.
Jede Lösung beteiligt find
und sort
und ls
ist ziemlich viel zu tun all die Arbeit zweimal. ls
und find
wird sowohl jeden Pfadnamen als auch stat
jede Datei auflösen . ls
und sort
werden beide alle Ergebnisse sortieren. Es ist wahrscheinlich am besten, nur die Single zu verwenden ls
.
Dann gibt es natürlich die date
und sed
Teile dieser Antwort. Das Wichtigste dabei ist, dass Sie den schwierigen Teil erledigen und den regulären Ausdruck zuerst - und nur einmal - abrufen und anschließend nur eine einzelne Liste von Ergebnissen beschneiden, anstatt zu sagen, Ergebnisse abzurufen, Ergebnisse abzurufen, Ergebnisse zu sortieren und Ergebnisse zu sortieren.
Dies funktioniert nicht bei Dateinamen, die Zeilenumbrüche enthalten, wie dies bei anderen Lösungen wahrscheinlich der Fall sein wird. Diese Lösung hat ihre eigenen Vorbehalte - die ich als nächstes erkläre - aber sie sind winzig und leicht zu handhaben. Meiner Meinung nach ist dies die robusteste Lösung hier.
Es gibt zwei Fälle, in denen der obige Befehl Probleme verursachen kann. Das erste ?
Problem betrifft die Globs in den Dateinamen. Da es sich bereits um eine robustere Lösung als alle anderen hier angebotenen handelt und die Wahrscheinlichkeit, dass Sie überhaupt auf einen stoßen, ?
gering genug ist, besteht die Möglichkeit, dass diese Globs aufgelöst werden könnte mit mehr als einem Dateinamen übereinstimmen. Bitte beachten Sie dies , um weitere Informationen zu diesem Thema.
Die andere Möglichkeit ist ein falsches Positiv - zum Beispiel, wenn Sie einen Dateinamen haben, der tatsächlich mit der date
Zeichenfolge übereinstimmt, mit der wir suchen, der grep
aber an keinem dieser Tage tatsächlich geändert wurde. Ich zähle nicht darauf, dass dies ein Problem ist, aber wenn ja, fragen Sie danach, und ich kann Ihnen wahrscheinlich dabei helfen, die Regex zu präzisieren, um damit umzugehen.
ls -ls **/*(.)