Hier finden Sie die neuesten Dateien

10

Wie finde ich die Datei heraus, auf die zuletzt in einem bestimmten Verzeichnis zugegriffen wurde?

Ich kann den findBefehl verwenden, um alle Dateien aufzulisten, die in den letzten nMinuten geändert wurden / auf die zugegriffen wurde . Aber hier in meinem Fall bin ich nicht sicher, wann die letzte Datei geändert wurde / zugegriffen wurde? Alles, was ich brauche, ist, alle Dateien, auf die kürzlich zugegriffen wurde, unter allen anderen Unterdateien oder Unterverzeichnissen aufzulisten, sortiert nach ihren Zugriffs- / Änderungszeiten.

Ist das möglich?

SHW
quelle
Ihre Frage ist unklar. Wollen Sie damit sagen, dass Sie die Liste der Dateien aus der Suche nehmen und nach Datum sortieren möchten?
RobertL
3
Oh, ich verstehe. Ich glaube. Sie möchten den gesamten Satz "aktueller" Dateien nach ihrer Zugriffs- / Änderungszeit sortieren, unabhängig von ihrem Speicherort im Dateibaum?
Roaima

Antworten:

4

Sie können den rekursiven Schalter ( -R) lszusammen mit dem Schalter zum Sortieren nach Zeit ( -t) und den Schalter zum umgekehrten Sortieren ( -r) verwenden, um alle Dateien in einem Verzeichnisbaum aufzulisten. Dadurch werden nicht alle Dateien nach ihren Zugriffs- / Änderungsdaten in Unterverzeichnissen sortiert, sondern nach diesem Datum in jedem Unterverzeichnis unabhängig sortiert.

Mit einem Befehl wie diesem : ls -ltrR <sometopdir>.

Beispiel

$ ls -ltrR .
total 759720
-rw-r-----@  1 sammingolelli  staff    2514441 Mar 31  2015 restfulapi-120704053212-phpapp01.pdf
-rw-r-----@  1 sammingolelli  staff     567808 Apr  7  2015 USGCB-Windows-Settings.xls
-rw-r-----@  1 sammingolelli  staff     180736 Apr  7  2015 USGCB-RHEL5-Desktop-Settings-Version-1.2.5.0.xls
-rw-r-----@  1 sammingolelli  staff       6474 Apr  8  2015 tap_kp_mavericks.txt

./kerberos:
total 5464
-rw-r-----@ 1 sammingolelli  staff    37317 Oct  2 13:03 Set_up_Kerberos_instruction_d8.docx
-rw-r-----@ 1 sammingolelli  staff  2753195 Oct 13 13:49 Keberos configuration with AD 01_09_2014.pdf

./homestarrunner:
total 10624
-rw-rw-rw-@ 1 sammingolelli  staff   319422 May 10  2000 error_hs.wav
-rw-rw-rw-@ 1 sammingolelli  staff    53499 Jun  8  2001 sb_duck.mp3
-rw-rw-rw-@ 1 sammingolelli  staff   199254 Mar 11  2002 email_sb.wav
-rw-rw-rw-@ 1 sammingolelli  staff    39288 Mar 25  2002 bubs_dontutalk.mp3
-rw-rw-rw-@ 1 sammingolelli  staff    75432 May  6  2002 trash_sb.wav
-rw-rw-rw-@ 1 sammingolelli  staff   298946 Dec  1  2002 error_sb.wav
-rw-rw-rw-@ 1 sammingolelli  staff   298686 Dec  1  2002 startup_hs.wav
-rw-rw-rw-@ 1 sammingolelli  staff    90279 Dec  1  2002 sb_meedlymee.mp3
-rw-rw-rw-@ 1 sammingolelli  staff    73561 Dec  1  2002 sb_dubdeuce.mp3
-rw-rw-rw-@ 1 sammingolelli  staff   193097 Dec  1  2002 sb_pizza.mp3
-rw-rw-rw-@ 1 sammingolelli  staff    30093 Dec  1  2002 sb_stiny.mp3
-rw-rw-rw-@ 1 sammingolelli  staff    61858 Dec  1  2002 ss_sadflying.mp3
-rw-rw-rw-@ 1 sammingolelli  staff   150142 Dec  1  2002 email_hs.wav
-rw-rw-rw-@ 1 sammingolelli  staff    68545 Dec  1  2002 bubs_grabbinbutt.mp3
-rw-rw-rw-@ 1 sammingolelli  staff    61022 Dec  1  2002 cz_jeorghb.mp3
-rw-rw-rw-@ 1 sammingolelli  staff    40124 Dec  1  2002 marzy_nasty.mp3
-rw-rw-rw-@ 1 sammingolelli  staff   224116 Dec  1  2002 shutdown_sb.wav
-rw-rw-rw-@ 1 sammingolelli  staff   260546 Dec  1  2002 shutdown_hs.wav
-rw-rw-rw-@ 1 sammingolelli  staff    57686 Dec  1  2002 trash_hs.wav
slm
quelle
13

So drucken Sie die Dateien, auf die zuletzt zugegriffen wurde (sortiert von der Datei, auf die zuletzt zugegriffen wurde, bis zur Datei, auf die zuletzt zugegriffen wurde):

find . -type f -exec stat -c '%X %n' {} \; | sort -nr | awk 'NR==1,NR==3 {print $2}'

So drucken Sie die letzten 3 geänderten Dateien (sortiert von der zuletzt geänderten bis zur vorletzten geänderten Datei):

find . -type f -exec stat -c '%Y %n' {} \; | sort -nr | awk 'NR==1,NR==3 {print $2}'
  • find . -type f -exec stat -c '%X %n' *: Gibt die letzte Zugriffszeit aus, gefolgt vom Dateipfad für jede Datei in der aktuellen Verzeichnishierarchie.
  • find . -type f -exec stat -c '%Y %n' *: Gibt die Zeit der letzten Änderung aus, gefolgt vom Dateipfad für jede Datei in der aktuellen Verzeichnishierarchie.
  • sort -nr: sortiert in umgekehrter numerischer Reihenfolge;
  • awk 'NR==1,NR==3 {print $2}': druckt das zweite Feld der ersten, zweiten und dritten Zeile.

Sie können die Anzahl der anzuzeigenden Dateien ändern, indem Sie 3 auf die gewünschte Anzahl von Dateien in ändern awk 'NR==1,NR==3 {print $2}'.

% touch file1
% touch file2
% touch file3
% find . -type f -exec stat -c '%X %n' {} \; | sort -nr | awk 'NR==1,NR==3 {print }'
./file3
./file2
./file1
% find . -type f -exec stat -c '%Y %n' {} \; | sort -nr | awk 'NR==1,NR==3 {print }'
./file3
./file2
./file1
% cat file1
% find . -type f -exec stat -c '%X %n' {} \; | sort -nr | awk 'NR==1,NR==3 {print }'
./file1
./file3
./file2
% find . -type f -exec stat -c '%Y %n' {} \; | sort -nr | awk 'NR==1,NR==3 {print }'
./file3
./file2
./file1
% touch file2
% find . -type f -exec stat -c '%X %n' {} \; | sort -nr | awk 'NR==1,NR==3 {print }'
./file2
./file1
./file3
% find . -type f -exec stat -c '%Y %n' {} \; | sort -nr | awk 'NR==1,NR==3 {print }'
./file2
./file3
./file1
kos
quelle
Befehl ehrt nicht dieyear
SHW
@ SHW Nicht sicher, was du meinst. Die Dateien werden nach der Anzahl der Sekunden sortiert, die seit dem 1. Januar 1970 vergangen sind.
kos
Funktioniert unter Mac OS X, aber mit einer leichten Änderung des stat-Befehls:stat -f '%Dm %N'
Matt Kneiser
So helfen Sie anderen Benutzern: Wenn Sie ein anderes Verzeichnis als das aktuelle Verzeichnis scannen möchten, ersetzen Sie das .direkt nach dem find. Ich brauchte ein paar Minuten, um es zu verstehen.
Marc Vanhoomissen
Diese Befehle werden für Dateinamen unterbrochen, die Leerzeichen enthalten. Der Schuldige ist awkund da ich nicht weiß, wie ich es verwenden soll, reicht es aus, einfach den awkBefehl durch | head -n 3(um die ersten drei Ergebnisse zu behalten) zu ersetzen . Wenn Sie die Zeitstempel immer noch entfernen möchten, | cut -d' ' -f2-
verketten Sie
4

Dieser Befehl stellt auch die zuletzt geänderte Datei oder das zuletzt geänderte Verzeichnis aus dem aktuellen Verzeichnisbaum bereit:

% find . -printf '%TY-%Tm-%TdT%TT %p\n' |sort |tail -1
2019-01-30T17:29:18.0330479800 ./servlet-api/META-INF/NOTICE

Natürlich können Sie das letzte Argument in die Anzahl der zuletzt benötigten Dateien ändern.

RichardO
quelle
3

Wenn Sie möchten, dass die Dateien in einem bestimmten Verzeichnis nach Änderungsalter sortiert sind (zuletzt zuerst):

ls -t

Fügen Sie die -uOption hinzu, um nach Zugriffszeit zu sortieren .

ls -tu

Beachten Sie jedoch, dass moderne Linux-Systeme standardmäßig nicht die genauen Zugriffszeiten erfassen . Daher sind die Zugriffszeitstempel möglicherweise nicht zuverlässig.

Wenn Sie die neueste Datei in einem Verzeichnisbaum einschließlich der Unterverzeichnisse suchen möchten, ist die mit Abstand einfachste Methode die Verwendung der Glob-Qualifizierer von zsh .

print -lr -- **/*(om)

Verwenden Sie oaanstelle von om, um die Zugriffszeit anstelle der Änderungszeit zu verwenden. Sie können die Übereinstimmungen einschränken, um beispielsweise die 10 neuesten Dateien abzurufen:

print -lr -- **/*(om[1,10])
Gilles 'SO - hör auf böse zu sein'
quelle
1

Sie möchten den gesamten Satz "aktueller" Dateien nach ihrer Zugriffs- / Änderungszeit sortieren, unabhängig von ihrem Speicherort im Dateibaum?

Eine Möglichkeit, dies zu tun, besteht darin stat, die Änderungszeit für jede Datei sortanhand des Ergebnisses und dann cutdie Änderungszeit aus den Ergebnissen zu drucken .

Dies wird für Dateien unterbrochen, deren Namen Zeilenumbrüche enthalten. Für andere Dateien gibt es jedoch eine Lösung, mit der Dateien aufgelistet werden, die innerhalb der letzten 60 Minuten geändert wurden und von zuletzt bis zuletzt geändert wurden:

find . -type f -mmin -60 -exec stat -c $'%Y\t%n' {} + | sort -nr | cut -f2-
Roaima
quelle
0

Lassen Sie uns dies in eine plattformübergreifende Bash-Funktion einfügen:

# Print N most recently modified files in current dir or below
mrf() {
    local _n=${1:-3} # Default to 3
    case $OSTYPE in
        linux*|msys*)
            find . -type f -exec stat -c '%X %n' {} \; | sort -nr | awk -v var="${_n}" 'NR==1,NR==var {print $0}' | while read t f; do d=$(date -d @$t "+%b %d %T %Y"); echo "$d -- $f"; done
        ;;
        darwin*)
            find . -type f -exec stat -f '%Dm %N' {} \; | sort -nr | awk -v var="${_n}" 'NR==1,NR==var {print $2}' | while read f; do stat -f '%Sm -- %N' $f; done
        ;;
     esac
 }

Verwendungszweck:

$ mrf
Jan 10 11:50:03 2019 -- ./somefile
Jan 10 11:44:24 2019 -- ./nested/dir/file.txt
Jan 10 11:40:50 2019 -- ./anotherfile

$ mrf 5
Jan 10 11:50:03 2019 -- ./somefile
Jan 10 11:44:24 2019 -- ./nested/dir/file.txt
Jan 10 11:40:50 2019 -- ./anotherfile
Jan 10 06:30:22 2019 -- ./otherdir/yetanotherfile
Jan 09 10:00:00 2019 -- ./oldfile
Matt Kneiser
quelle
0

Ich habe das erwähnte "mrt" -Skript von Matt Kneiser für einige Untersuchungen verwendet. Dann wurden ab dem 11.12.2018 mehrere Dateien angezeigt. Bei weiteren Untersuchungen stellte ich fest, dass das angegebene Datum nicht das Änderungsdatum, sondern das Zugriffsdatum war. In Bezug auf das statHandbuch ist die korrekte Formatzeichenfolge unter Linux nicht% X, sondern% Y für das Datum der letzten Änderung anstelle des letzten Zugriffsdatums. Hier die manuellen Einträge vom 17.03.2020 auf debian:

%X     time of last access, seconds since Epoch
%Y     time of last data modification, seconds since Epoch

Meiner Meinung nach sollte die korrekte Linux-Anweisung in Ihrem Skript folgendermaßen aussehen:

find . -type f -exec stat -c '%Y %n' {} \; | sort -nr | awk -v var="${_n}" 'NR==1,NR==var {print $0}' | while read t f; do d=$(date -d @$t "+%b %d %T %Y"); echo "$d -- $f"; done
OASE Software GmbH
quelle
Willkommen auf der Website und vielen Dank für Ihren Beitrag. Ihre Eröffnungsadresse richtet sich an den Mitwirkenden einer anderen Antwort. Dies kann für die Leser verwirrend sein, da die Antworten je nach Aktivität, Stimmenzahl und individuellen Benutzereinstellungen in beliebiger Sortierreihenfolge angezeigt werden. Bitte formulieren Sie die Antwort neu, um sie so "in sich geschlossen" wie möglich zu gestalten, bis Sie den erforderlichen Ruf haben, um überall Kommentare abzugeben. Sie können weiterhin darauf verweisen, indem Sie einen Link einfügen. Siehe die Schaltfläche "Teilen" unter der anderen Antwort (vorausgesetzt, ich habe die richtige gefunden;)).
AdminBee
1
@AdminBee danke für deinen Vorschlag. Ich habe der Ursprungsantwort einen Link hinzugefügt, den ich verbessern wollte. Hoffe das hilft.
OASE Software GmbH