2016-04-28 5 views
1

Laut GNU scheint das Änderungsdatum nur auf die zweite Ebene genau zu sein. Ich habe ein sehr schnelles System, das viele Dateien in ein Verzeichnis (mit Millisekunden-Rate) generiert. Ich versuche, die erzeugten neuen Dateien zu überwachen und die Dateinamen dem Terminal anzuzeigen.In Linux, wie findet man Dateien mit Änderungsdatum nicht älter als eine bestimmte Datei?

Derzeit bin ich mit

touch .file 
sleep 1 
find -type f -newer .file 

Dateien zu finden, die geändert werden, nachdem .file erstellt wurde. Da das System jedoch mit sehr hoher Frequenz ausgeführt wird, scheint die Option -newer in find Dateien, die zur gleichen "Zeit" (genau wie in Sekunden) geändert wurden, nicht wie neu abzufangen touched.file. Um zu erläutern, was ich meine, sagen wir, habe ich die Datei unter 01:02:03 AM berührt, wird eine neue Datei erzeugt bei 01:02:03:02 AM (02 Millisekunden nach der .file). find ignoriert die Millisekunde und kommt zu dem Schluss, dass sie zur selben Zeit erstellt werden. Daher ist diese neue Datei nicht newer als .file, daher ignoriert.

Was ist ein Weg? Ich denke an die Verwendung ! -older, leider find hat keine solche Option. Ich möchte vermeiden, meine eigene Version von find zu schreiben, um Code-Größe zu speichern. Irgendwelche Vorschläge?

+0

Was ist mit "-nicht"? –

+1

Änderungszeiten sind nicht und sollten nicht als atomare Transaktions-IDs behandelt werden. Können Sie verarbeitete Dateien verschieben/umbenennen, sodass Sie immer wissen, welche ausstehen? –

+0

@thatotherguy Ich mag diese Idee wirklich. Leider sollten diese Dateien schreibgeschützt bleiben. Gibt es eine andere Möglichkeit, die Dateien zu markieren, ohne sie zu berühren? –

Antwort

0

Am besten wäre es, Dateinamen mit einer ID zu generieren und einen darauf basierenden Filter find zu verwenden.

Zurück zu Ihrer Frage, können Sie dies versuchen:

touch .file 
find . -type f -printf "%[email protected] %p\0" |\ 
    awk -v RS="\0" -v reftime=$(find . -name .file -printf "%[email protected]") \ 
     '$1>=reftime {print substr($0,index($0," ")+1)}' 

%[email protected] %p\0 drucken die letzte Änderungszeit in Sekunden seit dem 1. Januar 1970, 00:00 GMT, mit Bruchteil. Es folgt ein Leerzeichen und der Dateiname der Datei.

\0 als Separator für mehr Sicherheit verwendet: der Befehl wird nicht brechen, wenn Dateinamen Sonderzeichen enthalten \n" usw.

awk verwendet wird, um die letzten Änderungszeiten und druckt Dateinamen mit der letzten Änderung mal neuere vergleichen als oder gleich dem Zeitpunkt der letzten Änderung .file

Dank printf jeder Datensatz time + + filename ist. Natürlich wird $1 das erste Feld sein: die letzte Modifikationszeit.

In meinem Test auf meinem debian %[email protected] mal eine feste Länge haben. Ich index($0," ")+1 mit 22

Auf meinem debian ersetzen könnte der Bruchteil ist immer 0 (vielleicht eine Präzisionsausgabe), so in meinem Fall alle Dateien mit dem letzten Änderung in der gleichen Sekunde wie .file gedruckt werden: auch diejenigen, die sind erstellt ein wenig vor .file innerhalb der gleichen Sekunde.

Verwandte Themen