it-swarm.com.de

Ruft die aktuellste Datei in einem Verzeichnis unter Linux ab

Suchen Sie nach einem Befehl, der die zuletzt verwendete Datei in einem Verzeichnis zurückgibt.

Kein Grenzwert für ls zu sehen ...

128
ack
ls -Art | tail -n 1

Nicht sehr elegant, aber es funktioniert.

197
dmckee
ls -t | head -n1

Dieser Befehl liefert tatsächlich die zuletzt geänderte Datei im aktuellen Arbeitsverzeichnis. 

107
chaos

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

52
gioele

Ich benutze:

ls -ABrt1 --group-directories-first | tail -n1

Es gibt mir nur den Dateinamen, ausgenommen Ordner.

9
user1195354

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

7
Jared Oberhaus

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]* //'
3
Patrick

Ich mag echo *(om[1]) (zsh-Syntax), da nur der Dateiname angegeben wird und kein anderer Befehl aufgerufen wird.

3
MikeB

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.

3

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.

2
TrueY

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/* /

1
RICHA AGGARWAL

verwendung der rekursiven Option .. Sie können dies als Verbesserung für gute Antworten betrachten 

ls -arRtlh | tail -50
1
mebada
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'
1

Rekursiv:

find $1 -type f -exec stat --format '%Y :%y %n' "{}" \; | sort -nr | cut -d: -f2- | head
1
Konki

Vorausgesetzt, Sie interessieren sich nicht für versteckte Dateien, die mit einem . beginnen

ls -rt | tail -n 1

Andernfalls

ls -Art | tail -n 1
0
jasonleonhard

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.

0
basic6
ls -Frt | grep "[^/]$" | tail -n 1
0
João Fonseca

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" \;
0
xb.