Suchen Sie nach einem Befehl, der die zuletzt verwendete Datei in einem Verzeichnis zurückgibt.
Kein Grenzwert für ls zu sehen ...
ls -Art | tail -n 1
Nicht sehr elegant, aber es funktioniert.
ls -t | head -n1
Dieser Befehl liefert tatsächlich die zuletzt geänderte Datei im aktuellen Arbeitsverzeichnis.
Dies ist eine rekursive Version (d. H. Sie findet die zuletzt aktualisierte Datei in einem bestimmten Verzeichnis oder einem ihrer Unterverzeichnisse).
find $DIR -type f -printf "%[email protected] %p\n" | sort -n | cut -d' ' -f 2- | tail -n 1
Bearbeiten: Verwenden Sie -f 2-
anstelle von -f 2
, wie von Kevin vorgeschlagen
Ich benutze:
ls -ABrt1 --group-directories-first | tail -n1
Es gibt mir nur den Dateinamen, ausgenommen Ordner.
ls -lAtr | tail -1
Die anderen Lösungen enthalten keine Dateien, die mit '.'
beginnen.
Dieser Befehl enthält auch '.'
und '..'
, die möglicherweise nicht Ihren Wünschen entsprechen:
ls -latr | tail -1
Verkürzte Variante basierend auf der Antwort von dmckee:
ls -t | head -1
Die Such-/Sortierlösung funktioniert gut, bis die Anzahl der Dateien sehr groß wird (wie ein gesamtes Dateisystem). Verwenden Sie stattdessen awk, um nur die aktuellste Datei zu verfolgen:
find $DIR -type f -printf "%[email protected] %p\n" |
awk '
BEGIN { recent = 0; file = "" }
{
if ($1 > recent)
{
recent = $1;
file = $0;
}
}
END { print file; }' |
sed 's/^[0-9]*\.[0-9]* //'
Ich mag echo *(om[1])
(zsh
-Syntax), da nur der Dateiname angegeben wird und kein anderer Befehl aufgerufen wird.
Ein Hinweis zur Zuverlässigkeit:
Da das Newline-Zeichen in einem Dateinamen so gut wie jedes beliebige ist, ist jede Lösung, die auf lines wie die auf head
/tail
basierenden basiert, fehlerhaft.
Mit GNU ls
können Sie auch die --quoting-style=Shell-always
-Option und ein bash
-Array verwenden:
eval "files=($(ls -t --quoting-style=Shell-always))"
((${#files[@]} > 0)) && printf '%s\n' "${files[0]}"
(Fügen Sie -A
hinzu, wenn Sie auch versteckte Dateien berücksichtigen möchten).
Wenn Sie sich auf reguläre Dateien beschränken möchten (Verzeichnisse, Fifos, Geräte, Symlinks, Sockets usw. ignorieren), müssen Sie auf GNU find
zurückgreifen.
Mit bash 4.4 oder neuer (für readarray -d
) und GNU coreutils 8.25 oder neuer (für cut -z
):
readarray -t -d '' < <(
LC_ALL=C find . -maxdepth 1 -type f ! -name '.*' -printf '%[email protected]/%f\0' |
sort -rzn | cut -zd/ -f2)
((${#files[@]} > 0)) && printf '%s\n' "${files[0]}"
Oder rekursiv:
readarray -t -d '' < <(
LC_ALL=C find . -name . -o -name '.*' -Prune -o -type f -printf '%[email protected]%p\0' |
sort -rzn | cut -zd/ -f2-)
Am besten wäre es, zsh
und seine Glob-Qualifikationsmerkmale anstelle von bash
zu verwenden, um den ganzen Ärger zu vermeiden:
Neueste reguläre Datei im aktuellen Verzeichnis:
printf '%s\n' *(.om[1])
Einschließlich versteckter:
printf '%s\n' *(D.om[1])
Zweites neustes:
printf '%s\n' *(.om[2])
Überprüfen Sie das Alter der Datei nach der Auflösung von Symlink:
printf '%s\n' *(-.om[1])
Rekursiv:
printf '%s\n' **/*(.om[1])
Wenn das Vervollständigungssystem (compinit
für die neueste regular datei (nicht verzeichnis, fifo/device ...) und so weiter.
Ich persönlich bevorzuge es, so wenige nicht eingebaute bash
-Befehle zu verwenden, wie ich kann (um die Anzahl der teuren Fork- und Exec-Syscalls zu reduzieren). Um nach Datum zu sortieren, musste ls
aufgerufen werden. Die Verwendung von head
ist jedoch nicht unbedingt erforderlich. Ich verwende den folgenden Einzeiler (funktioniert nur bei Systemen, die Namensrohre unterstützen):
read newest < <(ls -t *.log)
oder um den Namen der ältesten Datei zu erhalten
read oldest < <(ls -rt *.log)
(Beachte den Abstand zwischen den beiden "<" -Marken!)
Wenn auch die versteckten Dateien benötigt werden, kann ein Argument hinzugefügt werden.
Ich hoffe das kann helfen.
versuchen Sie diesen einfachen Befehl
ls -ltq <path> | head -n 1
Wenn der Dateiname zuletzt geändert werden soll, lautet der Pfad = /ab/cd/*.log
Wenn Sie den Verzeichnisnamen benötigen - zuletzt geändert, Pfad =/ab/cd/* /
verwendung der rekursiven Option .. Sie können dies als Verbesserung für gute Antworten betrachten
ls -arRtlh | tail -50
ls -t -1 | sed '1q'
Zeigt das zuletzt geänderte Element im Ordner an. Koppeln Sie mit grep
, um die neuesten Einträge mit Schlüsselwörtern zu finden
ls -t -1 | grep foo | sed '1q'
Rekursiv:
find $1 -type f -exec stat --format '%Y :%y %n' "{}" \; | sort -nr | cut -d: -f2- | head
Vorausgesetzt, Sie interessieren sich nicht für versteckte Dateien, die mit einem .
beginnen
ls -rt | tail -n 1
Andernfalls
ls -Art | tail -n 1
Alle diese ls/tail-Lösungen funktionieren einwandfrei für Dateien in a directory - und ignorieren Unterverzeichnisse.
Um alle Dateien (rekursiv) in Ihre Suche einzubeziehen, kann find verwendet werden. gioele schlug vor, die formatierte Suchausgabe zu sortieren. Aber seien Sie vorsichtig mit Whitespaces (sein Vorschlag funktioniert nicht mit Whitespaces).
Dies sollte mit allen Dateinamen funktionieren:
find $DIR -type f -printf "%[email protected] %p\n" | sort -n | sed -r 's/^[0-9.]+\s+//' | tail -n 1 | xargs -I{} ls -l "{}"
Dies sortiert nach mtime, siehe man find:
%Ak File's last access time in the format specified by k, which is either `@' or a directive for the C `strftime' function. The possible values for k are listed below; some of them might not be available on all systems, due to differences in `strftime' between systems.
@ seconds since Jan. 1, 1970, 00:00 GMT, with fractional part.
%Ck File's last status change time in the format specified by k, which is the same as for %A.
%Tk File's last modification time in the format specified by k, which is the same as for %A.
Ersetzen Sie einfach %T
durch %C
, um nach ctime zu sortieren.
ls -Frt | grep "[^/]$" | tail -n 1
Das Finden der aktuellsten Datei in jedem Verzeichnis nach einem Muster, z. die Unterverzeichnisse des Arbeitsverzeichnisses, deren Name mit "tmp" endet (Groß- und Kleinschreibung wird nicht berücksichtigt):
find . -iname \*tmp -type d -exec sh -c "ls -lArt {} | tail -n 1" \;