Wie zeige ich die geänderte Uhrzeit mit dem Befehl 'find' an?

79

Mit einem findBefehl kann ich Verzeichnisnamen mit mehreren Ebenen anzeigen. Der folgende Befehl zeigt alle Verzeichnisse unter /varPfad mit einer Tiefe von 2 an:

find /var -maxdepth 2 -type d;

Das Ergebnis zeigt:

/var
/var/log
/var/log/sssd
/var/log/samba
/var/log/audit
/var/log/ConsoleKit
/var/log/gdm
/var/log/sa

Mit einem statBefehl kann ich das geänderte Datum und die Uhrzeit ermitteln:

stat /var/log/samba | grep 'Modify:'

Das Ergebnis ist:

Modify: 2014-01-02 11:21:27.762346214 -0800 

Gibt es eine Möglichkeit, die beiden Befehle so zu kombinieren, dass Verzeichnisse mit geänderter Datums- und Uhrzeitangabe aufgelistet werden?

Schnurrt
quelle

Antworten:

60

Sie können den -execSchalter für Folgendes verwenden findund das Ausgabeformat für die statVerwendung des -cSchalters wie folgt definieren:

find /var -maxdepth 2 -type d -exec stat -c "%n %y" {} \;

Dies sollte den Dateinamen gefolgt von seiner Änderungszeit in derselben Zeile der Ausgabe angeben.

rc0r
quelle
Es ist besser als meine Antwort, +1
Kent
Mit der folgenden -printfOption wird vermieden, statdass jede gefundene Datei aufgerufen wird. In meinem Test liefert der Befehl eine nahezu identische Ausgabe, nur die Genauigkeit einer zusätzlichen Ziffer in Sekunden.
mwfearnley
Für MacOS für das Format arg Charakter statist -f. find /var -maxdepth 2 -type d -exec stat -f "%t%Sm %N" {} \;
Toddcscar
121

Die akzeptierte Antwort funktioniert, ist aber langsam. Es ist nicht erforderlich, stat für jedes Verzeichnis auszuführen. Find gibt das Änderungsdatum an und Sie können es einfach direkt ausdrucken. Hier ist ein gleichwertiger Befehl, der erheblich schneller ist:

 find /var -maxdepth 2 -type d -printf "%p %TY-%Tm-%Td %TH:%TM:%TS %Tz\n"
kzar
quelle
4
Eine viel bessere Lösung. Es funktioniert auch mit dem findvon msys unter Windows, dem ein statBefehl fehlt .
Snorfalorpagus
7
Auf Macs hat 'Brew Install Findutils' und dann hat gfind die Option -printf.
WeakPointer
%Tcdruckt "Datum und Uhrzeit des Gebietsschemas" und erlaubt die Formatzeichenfolge "% p% Tc"
Andreas
Weitere hilfreiche Links zur Erläuterung von% Formatierern. unix.stackexchange.com/a/215236/216480 oder auf der Manpage nach "-printf format"
suchen
1
Während die Formatzeichenfolge "% p% Tc" funktioniert, formatiert sie die Ausgabe etwas anders. ZB "/ var / spool Mo 29 Sep 2014 09:05:54 BST" anstelle von "/ var / spool 2014-09-29 09: 05: 54.000000000 +0100".
Zar
15

find /var -maxdepth 2 -type d | xargs ls -oAHd

Auf diese Weise können Sie mit Ihrem lsBasisbefehl den vollständigen Verzeichnispfad anzeigen. Während lsder -RParameter für die rekursive Suche vorhanden ist, werden Pfade in den Ergebnissen nicht mit der Option -loder angezeigt -o(zumindest in OSX), z. B. mit : ls -lR.

Kennzeichen
quelle
Bitte fügen Sie eine Erklärung hinzu, warum dies die Frage beantwortet. Im Allgemeinen besteht die Kultur jedes Mal, wenn Sie Beispielcode in einer Antwort auf StackOverflow veröffentlichen, darin, eine Erklärung dafür bereitzustellen. Andernfalls besteht die Gefahr, dass die Moderatoren Ihre Antwort aufgrund ihrer kurzen Länge und mangelnden Erklärung als Antwort von geringer Qualität löschen.
Sideshowbarker
3
Dieser, den Sie erreichen können, find /var -maxdepth 2 -type d -lsist einfach einfacher.
Grzegorz Krauze
11

Neuere GNU-Versionen von enthalten findauch eine -printfOption, die Datumsfelder enthält. Wenn Sie den Dateinamen und die Änderungszeit im Standardformat "C" drucken müssen, können Sie verwenden -printf "%c %p\n".

Wenn Sie das Datum in einem bestimmten Format haben möchten, können Sie das %Cgefolgt von einem Feldzeichen verwenden. Zum Beispiel, 4-stellige Jahr wäre %CY, mit Ywobei das Zeichen für 4-stellige Jahr.
Beachten Sie, dass Sie mehrere Felder angeben müssen, wenn Sie mehrere Felder benötigen %C. Das Format JJJJ-MM-TT würde beispielsweise so aussehen %CY-%Cm-%Cd.

Weitere Informationen finden Sie in den Manpages oder in der Online-Dokumentation .

Hier ist ein Arbeitsbeispiel:

find . -name favicon.ico -printf "%c %p\n"
Herr Lama
quelle
7

Eine andere, mit der ich am letzten Tag geänderte Dateien gedruckt habe. ls -ltr gibt mir detailliertere Informationen wie Änderungszeit, Benutzer usw.

find <my_dir> -mtime -1 -type f -print | xargs ls -ltr 
user666
quelle
1
Dies ist am einfachsten, am einfachsten zu merken und am schnellsten zu tippen. (Ich benutze es ohne die Argumente -mtime und -type, stattdessen benutze ich eine -name '*.ext'Spezifikation. Sortiert ls -ltnach der Änderungszeit.)
Brent Faust
Dies funktioniert nicht, wenn der Dateiname Leerzeichen enthält. Besser ist es, -print0anstelle von -printund dann xargs -0anstelle von zu verwenden xargs.
emk2203
1

Versuchen Sie diese Zeile:

find /var -maxdepth 2 -type d|xargs stat|grep -E 'File|Modi'

hier habe ich es ausgeführt, es gibt aus:

....
  File: ‘/var/cache/cups’
Modify: 2013-12-24 00:42:59.808906421 +0100
  File: ‘/var/log’
Modify: 2014-01-01 12:41:50.622172106 +0100
  File: ‘/var/log/old’
Modify: 2013-05-31 20:40:23.000000000 +0200
  File: ‘/var/log/journal’
Modify: 2013-12-15 18:56:58.319351603 +0100
  File: ‘/var/log/speech-dispatcher’
Modify: 2013-10-27 01:00:08.000000000 +0200
  File: ‘/var/log/cups’
Modify: 2013-12-22 00:49:52.888346088 +0100
  File: ‘/var/opt’
Modify: 2013-05-31 20:40:23.000000000 +0200
....
Kent
quelle