Wie bekomme ich nur Dateien, die nach einem Datum mit ls erstellt wurden?

97

Ist es mit dem lsBefehl möglich, nur die Dateien anzuzeigen, die nach einem bestimmten Datum, einer bestimmten Stunde ... erstellt wurden?

Ich frage es, weil ich ein Verzeichnis mit Tausenden von Dateien habe.

Ich möchte also alle Dateien sehen, die seit gestern erstellt wurden.

Ich benutze, ls -ltraber ich muss warten, um alle Dateien zu sehen ...

Gibt es eine Entsprechung DIRECTORY/SINCE=datevon OpenVMS?

Luc M
quelle
1
lslistet Dateien auf, bietet aber nicht viel Auswahlmöglichkeiten für die aufzulistenden Dateien oder das Ausgabeformat. Verwenden Sie Globbing (Shell-Platzhalter) oder, findwenn Sie Dateien nach Namen oder Metadaten (z. B. Datum) auswählen möchten.
Gilles
3
Wie war das Date mit ls? Haben Sie beide verstanden?
Garrett Albright
3
Mit zsh:ls -1 -- *(.m-1)
don_crissti

Antworten:

123

Mit dem findBefehl können Sie alle Dateien suchen, die nach einer bestimmten Anzahl von Tagen geändert wurden.

Um beispielsweise alle Dateien im aktuellen Verzeichnis zu finden, die seit gestern (vor 24 Stunden) geändert wurden, verwenden Sie:

find . -maxdepth 1 -mtime -1

Beachten Sie, dass Sie anstelle von Dateien suchen müssen, die vor 24 Stunden geändert wurden .-mtime +1-mtime -1

Dogbane
quelle
3
Genau das hätte ich gesagt. Es gibt keinen Grund, sich lshier zu beschränken, Luc.
Warren Young
14
Mit GNU find gibt es andere Möglichkeiten. -mmin 5listet Dateien auf, die in den letzten 5 Minuten geändert wurden. -newermt "2011-02-27 13:42"listet Dateien auf, die seit dem angegebenen Datum geändert wurden. Sie können -exec ls --color -ld {} +statt verwenden -ls, um das übliche Farbdisplay zu erhalten (wenn Sie die farbige Ausgabe mögen).
Gilles
3
Beachten Sie das Minuszeichen:find . -mmin -5
user7543
und -maxdepth 1 kann auf einen beliebigen n-Wert erhöht werden, um auch Dateien unter der Unterverzeichnisebene zu
durchsuchen
3
bei mir funktioniert es so: find. -type f -newermt '15.01.2012 18:09:00'
woohoo
15
find . -type f -newermt '1/30/2017 0:00:00'

Dies findet alle Dateien, die nach einem bestimmten Datum geändert wurden.

Nichtigkeit
quelle
1
ls -ltr | grep "`date | awk '{print $2" "$3}'`"
Trant Batey
quelle
5
Hallo Trant! Während Ihre Lösung kreativ ist und versucht, die Aufforderung der Frage zu berücksichtigen, ls zu verwenden, ist das Parsen der Ausgabe von ls selten sicher (z. B. was passiert mit Dateinamen, einschließlich Zeilenumbrüchen hier?), Und wir möchten, dass Antworten nicht nur eins sind. Liner, sondern zu erklären, wie sie so detailliert arbeiten, wie es relevant ist.
Dhag
1
Probleme: (1) Auf meinem System, datesagt Jun 03, lssagt aber Jun  3, so funktioniert das nicht. (2) Vor einer Woche war das Datum der 27. Mai. Es wurden  ls -l | grep "May 27"Dateien gefunden, die an diesem Tag geändert wurden, aber auch Dateien, die am 27. Mai eines anderen Jahres geändert wurden - und Dateien mit dem Zusatz „27. Mai“ im Namen. (Und wenn Sie denken , das ist eine völlig falsche Sorge, aufblicken „10. Dezember“ .) (3) Und wenn Sie bekommen es geschafft, zu datesagen Jun 2, greppen dafür finden würde Jun 20durch Jun 29, aber nicht Jun  2(mit zwei Räumen). … (Fortsetzung)
G-Man
1
(Fortsetzung)… (4) Das OP hat verwendet ls -ltr, um die zuletzt geänderten Dateien am Ende der Liste abzurufen . Wenn Sie nach einem Datum suchen, müssen Sie dies nicht tun (außer, um die Dateien für den 27. Mai 2015 am Ende der Auflistung abzurufen, nach den Dateien für den 27. Mai 2014, den 27. Mai 2013 usw.). (5) In awk print $2, $3ist äquivalent zu print $2" "$3und ist viel einfacher zu lesen - insbesondere wenn es drei andere Ebenen von Anführungszeichen gibt.
G-Man,
ls -ltr | grep "$(date | awk '{print $2,$3}')"
SergioAraujo
0

Hoffe das funktioniert:

ls -ltr | awk '$6 == "May" && $7 >=01 && $7 <= 31 {print $9}'

Hier:

$6 indicates position of month
$7 indicates day of the month

Dieser Befehl gibt alle Dateinamen aus, die am oder nach dem 1. Mai bis 31. Mai erstellt wurden

Wenn Sie das Datum auch auf der Konsole drucken möchten, versuchen Sie dies

ls -ltr | awk '$6 == "May" && $7 >=01 && $7 <= 31 {print $6"-"$7,$9}'

Wenn Sie den Pfad des Verzeichnisses angeben möchten, können Sie dies ausprobieren

ls -ltr <path>| awk '$6 == "May" && $7 >=01 && $7 <= 31 {print $6"-"$7,$9}'
Rohit Nimmala
quelle
Aus vielen Gründen ist es keine gute Idee, die lsAusgabe zu analysieren . Und nicht jeder spricht Englisch :-)
Luc M