Wie kann ich alle Dateien, die zwischen dem 22.12.2011 und dem 24.12.2011 geändert wurden, rekursiv auflisten?
files
recursive
timestamps
Klemme
quelle
quelle
Antworten:
Wenn Sie Dateien in einem Verzeichnis und seinen Unterverzeichnissen rekursiv suchen, verwenden Sie im Allgemeinen
find
.Die einfachste Möglichkeit, einen Datumsbereich anzugeben,
find
besteht darin, Dateien an den Bereichsgrenzen zu erstellen und das-newer
Prädikat zu verwenden.quelle
-newer
werden?-newer
wird nicht negiert, der zweite ist. "Dateien suchen, die neuer als,start
aber nicht neuer als sindstop
".start
und sindstop
.Unter Verwendung von Gilles 'Lösung und nachdem ich den man find (1) wieder gelesen hatte, fand ich eine einfachere Lösung. Die beste Option ist -newerXY. Die Flags m und t können verwendet werden.
Die Lösung ist also
Die Untergrenze inklusiv und die Obergrenze ist exklusiv, also habe ich 1 Tag hinzugefügt! Und es ist rekursiv. Es funktioniert gut mit find v4.5.9.
quelle
find -newermt 20150212 \! -newermt 20150213 | xargs grep 'keyword' -m 50 -l
(-m 50
= Suche in den ersten 50 Zeilen).-exec ... +
infind(1)
, wie:find -newermt 20150212 \! -newermt 20150213 -exec grep keyword -m 50 -l {} +
. Dies funktioniert genauso, ist aber billiger.find 4.7.0-git
).Beachten Sie zusätzlich zu den bereits gegebenen Antworten, dass Sie Ihre Daten direkt angeben können:
oder
wenn Sie zusätzlich die Uhrzeit angeben möchten.
quelle
Vorausgesetzt, Sie benötigen keine sekundengenaue Genauigkeit, sollte dies funktionieren.
EDIT: Changed
cmin
bismmin
nach @ Eelvex Kommentar. BEARBEITEN: '\!' fehltquelle
-cmin
ist "Statusänderung",-mmin
ist "Datenänderung". Sie wollen wahrscheinlich-mmin
find
kann eine ISO-formatierte Datums- / Uhrzeitangabe annehmen, sodass Sie beispielsweise für einen UTC-Server einen Zeitversatz von mehreren Stunden angeben können, von dem aus Sie sich gerade befinden. Dadurch muss auch ein Tag hinzugefügt werden, da Sie auch die Zeit vergleichen:quelle
Bitte beachten Sie, dass die als Duplikat markierte Frage nicht direkt beantwortet werden kann. Deshalb poste ich hier. Diese Antwort dient zur Beantwortung der Frage "Dateien müssen je nach Erstellungsdatum in einen anderen Ordner verschoben werden [duplizieren]".
Die Antworten sind vernünftig, aber es gab einige Einschränkungen bei einem reinen Suchbefehl. Ich habe dieses Shell-Skript geschrieben, um durch ein Verzeichnis mit so vielen Dateien zu gehen, dass das Dateisystem die Metadaten abfragt, um ein ls auszuführen. Außerdem wird auf einigen * nix-Systemen beim Ausführen von ls ein Fehler mit zu vielen Argumenten angezeigt.
Der Befehl find ist sehr mächtig und ich habe mit den aufgelisteten Methoden begonnen, aber ich hatte so viele Jahre an Daten in diesem Verzeichnis, dass ich alle Dateien wiederholt durchlaufen musste. Dies erzeugt eine Menge unnötiger Übergänge über jede Datei. Ich habe versucht, einen Bildschirm pro Jahr zu erstellen und mehrere Suchvorgänge auszuführen. Dies führte jedoch zu vielen Fehlern bei den einzelnen Suchvorgängen, und Dateien gingen verloren, wenn einer der Suchvorgänge verschoben wurde.
Mein Shell-Skript verschiebt eine Datei mit einem vierstelligen Jahr und einem zweistelligen Monat in das Zielverzeichnis. Es kann leicht auf einen zweistelligen Tag erweitert werden, indem ein paar Zeilen auskommentiert und ihre Gegenstücke auskommentiert werden. Ich glaube, es ist effizienter, weil es die Bewegungen in einem Durchgang der Suche durchgeführt hat, so dass mehrere Suchbefehle und Durchgänge über das Verzeichnis nicht erforderlich sind.
Einmal gespeichert und ausführbar gemacht, können Sie dieses Skript mit find wie folgt aufrufen.
Sie müssen sich nicht um die Einstellung der Option newermt für find kümmern, da find nur eine Ausführung pro gefundener Datei bereitstellt und das Skript alle Entscheidungen trifft.
Denken Sie daran, dass, wenn Sie -type f nicht auswählen, Verzeichnisse verschoben werden und dies wahrscheinlich Probleme verursacht. Sie können auch -type d verwenden, wenn Sie nur Verzeichnisse verschieben möchten. Wenn Sie den Typ nicht festlegen, wird dies mit ziemlicher Sicherheit zu unerwünschtem Verhalten führen.
Denken Sie daran, dass dieses Skript auf meine Bedürfnisse zugeschnitten wurde. Vielleicht möchten Sie einfach mein Konstrukt als Inspiration für ein für Ihre Bedürfnisse besser geeignetes Skript verwenden. Danke!
Überlegungen: Die Effizienz des Befehls kann erheblich verbessert werden, indem eine unbegrenzte Anzahl von Argumenten durch das Skript geleitet wird. Dies ist relativ einfach, wenn Sie die Variable $ @ übergeben. Wenn Sie die Funktionalität erweitern, können Sie beispielsweise die Funktion -exec + von find verwenden oder xargs nutzen. Ich kann das schnell umsetzen und meine eigene Antwort verbessern, aber das ist ein Anfang.
Da dies eine einmalige Skriptsitzung war, können wahrscheinlich viele Verbesserungen vorgenommen werden. Viel Glück!
quelle