Alle kürzlich geänderten Dateien auflisten (rekursiv)


20

Ich möchte also ( lszum Beispiel über) alle Dateien anzeigen , die in den letzten sieben Tagen geändert wurden. Wenn ich mich in meinem docroot-Ordner befinde, sollte es in der Lage sein, "tiefer" zu schauen.

Beispielsweise:

File        Last changed
docroot
|- myfile1  30.11.2015
|- myfile2  10.11.2015
|- MySub
   |-sub1   30.11.2015
   |-sub2   10.11.2015

Also sollte der ls(oder was auch immer passt) ausgeben myfile1und (wenn möglich) MySub/sub1.

Ist das mit einem Befehl machbar?

Antworten:


38

Na sicher. Aus dem Verzeichnis, in dem Sie sich befinden:

find . -type f -mtime -7 -exec ls -l {} \; 

Fügen Sie eine Umleitung hinzu (auch bekannt > results.txtals Speichern in dieser Datei).

  • type f tut nur Dateien und keine Verzeichnisse
  • mtime -7 macht vor 7 Tagen bis jetzt (+7 wäre 'älter als 7 Tage')
  • und füttert es dann ls, um eine lange Liste anzuzeigen

Sie können auch mit der ls -lRolle spielen:

find . -type f -mtime -7 -exec ls -Rl --time-style=long-iso {} \; 
find . -type f -mtime -7 -exec ls -R  --time-style=long-iso {} \; 

zeigt eine baumartige Methode mit Verzeichnissen zwischen den Dateien in der langen Liste (1) oder der kurzen Liste (2).


4
findEs gibt eine lsOption, die Sie einfach find . -type f -mtime -7 -ls
ausführen können

Sicher, aber das macht es ein bisschen allgemeiner (ich benutze diese Methode, um Dateien zu finden, die ich entfernen muss, und kann diesen Befehl ändern, um es zu tun :))
Rinzwind

3
Es ist auch sinnvoller zu verwenden, find ... -exec ls -l {} +was ls -lviel effizienter abläuft - weniger Male mit mehreren Parametern. Dies ist eine Standardoption findvon POSIX.
Pabouk

5

Mit zsh:

ls -l **/*(.m-7)
  • **/* sucht ab dem aktuellen Verzeichnis rekursiv nach Dateien

  • (.m-7)ist das Glob-Qualifikationsmerkmal, bei dem es sich .um eine reguläre Datei handelt und m-7um Dateien, die innerhalb der letzten 7 Tage geändert wurden


2

Der folgende Befehl ist unter Mac OS X ein Traum - vielleicht auch unter Ubuntu ...

find . -type f -mtime -7 -exec stat -lt "%Y-%m-%d %H:%M:%S" {} \; | cut -d\  -f6- | sort -r

Dies findet Dateien im aktuellen Verzeichnisbaum, die in den letzten 7 Tagen geändert wurden, gibt das Änderungsdatum + die Uhrzeit und den Pfad aus, wobei die neuesten zuerst sortiert werden.

Beispielausgabe:

2018-02-21 22:06:30 ./fmxmlsnippet.xml
2018-02-19 12:56:01 ./diff.html
2018-02-19 12:44:37 ./temp/iDDR/XMSC_fmxmlsnippet.xml
2018-02-18 22:04:05 ./temp/iDDR/XMFD_fmxmlsnippet.xml
2018-02-15 10:18:27 ./xml/iDDR/XML2_fmxmlsnippet.xml
2018-02-15 10:13:29 ./xsl/fmxmlsnippet/XML2_fmCM_AnalyseLayout.xsl
2018-02-15 10:11:36 ./xsl/.DS_Store
2018-02-15 10:10:51 ./xsl/_inc/inc.XML2_fmCM_ReportReferencesToExternalFiles.xsl
2018-02-15 10:10:09 ./xsl/_inc/.DS_Store
2018-02-15 10:07:35 ./xsl/fmxmlsnippet/XML2_fmCM_AnalyseLayout-NoAnchors.xsl
2018-02-15 10:07:35 ./xsl/_inc/inc.XML2_fmCM_AnalyseLayout.xsl

Für Feedback von Ubuntu-Usern wäre ich dankbar.


Die einzige Lösung, die für mich auf dem Mac gut funktioniert hat. Vielen Dank!
artnikpro

Herzlich willkommen bei artnikpro!
MrWatson

1

Nicht genau das, wonach gefragt wurde ... aber viel leichter zu merken ...

ls -alRt docroot

oder

ls -alRt /path/to/top/level/directory

0

7 Tage, das sind 60 Sekunden * 60 Minuten * 24 Stunden * 7 Tage = 604800 Sekunden

Finden Sie das aktuelle Datum in Sekunden heraus (Unix-Epochenzeit):

$ date +%s
1448876323

Subtrahiere die 7 Tage in Sekunden:

expr $(date +%s) - 604800
1448271548

Nehmen Sie nun statBefehls- und Druckstatistiken für alle Dateien im Format "Name + Zeit in Sekunden" und verwenden Sie diese awk, um diejenigen Dateien abzuschneiden, deren Änderungszeit größer als das von uns berechnete Datum ist

$ stat --printf="%n %Y\n" $HOME/* | awk '$2 > 1448271265 {print $0}'
/home/xieerqi/1448428697574.png 1448429613
/home/xieerqi/1448763343273.png 1448763478
/home/xieerqi/1510DRIVE 1448352453
/home/xieerqi/addRemoveDistribution 1448666843
/home/xieerqi/add-update.awk 1448716356
/home/xieerqi/add-update.sh 1448625092

Besonders interessant sind die letzten 3 Dateien, da ich weiß, dass ich sie vor weniger als 7 Tagen bearbeitet habe. So weiß ich, dass es funktioniert


2
Beachten Sie, dass Sie stattdessen awk '$2 > 1448271265 {print $0}'direkt sagen können awk '$2 > 1448271265'. Unter der Bedingung true druckt awk die aktuelle Zeile als Standardaktion.
Fedorqui
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.