Suchen Sie nach einem Befehl, der die letzte einzelne Datei in einem Verzeichnis zurückgibt.
Kein Grenzwertparameter für ls
...
linux
command-line
ack
quelle
quelle
watch -n1 'ls -Art | tail -n 1'
- zeigt die allerletzten Dateienls
oder Verwendung,find
ohne-print0
die es problematisch ist, mit nervigen Dateinamen umzugehen. Immer nützlich zu erwähnen: BashFAQ099, das eine POSIX-Antwort auf dieses Problem gibtAntworten:
Nicht sehr elegant, aber es funktioniert.
quelle
ls
antail
weiter und druckt dann nur die letzte Zeile. IMHO ist es besser, in aufsteigender Reihenfolge zu sortieren undhead
stattdessen zu verwenden, wiechaos
vorgeschlagen. Nach dem Drucken wird der Kopf der ersten Zeile beendet. Wenn Sie also die nächste Zeile (tatsächlich den nächsten Block) senden,ls
wird ein SIGPIPE ausgelöst und auch beendet.Dieser Befehl gibt tatsächlich die zuletzt geänderte Datei im aktuellen Arbeitsverzeichnis an.
quelle
ls -tl | head -n 1
, und es muss nicht die gesamte Tabelle wie bei mir durch die Pipe geschoben werden .ls -t *.png | head -n1
ls -Art | head -n1
die zuletzt geänderte Datei handelt. Verwenden Sie: Wenn Sie speziell die zuletzt geänderte DateiDies ist eine rekursive Version (dh sie findet die zuletzt aktualisierte Datei in einem bestimmten Verzeichnis oder einem ihrer Unterverzeichnisse).
Bearbeiten: Verwenden Sie
-f 2-
anstelle der-f 2
von Kevin vorgeschlagenenquelle
find $DIR -type f -exec stat -lt "%Y-%m-%d" {} \+ | cut -d' ' -f6- | sort -n | tail -1
sort -nr
,head -n 1
anstelle von verwendentail -n 1
und die Effizienz geringfügig verbessern. (Obwohl, wenn Sie einen rekursiven Fund sortieren, das Erhalten der ersten oder letzten Zeile nicht der langsame Teil ist.)find ./ -type f -printf "%T@ %p\n" -ls | sort -n | cut -d' ' -f 2- | tail -n 1 | xargs -r ls -lah
find $DIR -type f -exec stat -lt "%F %T" {} \+ | cut -d' ' -f6- | sort -n | tail -1
Ein Hinweis zur Zuverlässigkeit:
Da das Zeilenumbruchzeichen genauso gültig ist wie jedes in einem Dateinamen, ist jede Lösung, die auf Zeilen wie den
head
/tail
basiert basiert, fehlerhaft.Bei GNU
ls
besteht eine weitere Option darin, die--quoting-style=shell-always
Option und einbash
Array zu verwenden:(Fügen Sie die
-A
Option hinzu,ls
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 ... ignorieren), müssen Sie auf GNU zurückgreifen
find
.Mit Bash 4.4 oder neuer (für
readarray -d
) und GNU Coreutils 8.25 oder neuer (fürcut -z
):Oder rekursiv:
Am besten wäre es, die
zsh
Glob-Qualifikationsmerkmale zu verwenden, anstattbash
all diesen Ärger zu vermeiden:Neueste reguläre Datei im aktuellen Verzeichnis:
Einschließlich versteckter:
Zweitneueste:
Überprüfen Sie das Alter der Datei nach der Symlink-Auflösung:
Rekursiv:
Wenn das Vervollständigungssystem (
compinit
und Co) aktiviert ist, Ctrl+Xmwird es zu einem Vervollständiger, der auf die neueste Datei erweitert wird.So:
Sie würden die neueste Datei bearbeiten (Sie können auch sehen, welche sie ist, bevor Sie drücken Return).
Für die zweitneueste Datei.
für die neueste
c
Datei.für die neueste reguläre Datei (weder Verzeichnis noch FIFO / Gerät ...) und so weiter.
quelle
zsh
Tipps. Könnten Sie einen Link zu weiteren Details in zsh-Dokumenten bereitstellen?info zsh qualifiers
Ich benutze:
ls -ABrt1 --group-directories-first | tail -n1
Es gibt mir nur den Dateinamen, ausgenommen Ordner.
quelle
ls -lAtr | tail -1
Die anderen Lösungen enthalten keine Dateien, die mit beginnen
'.'
.Dieser Befehl enthält auch
'.'
und'..'
, was möglicherweise das ist, was Sie wollen oder nicht:ls -latr | tail -1
quelle
Kurzgeschlossene Variante basierend auf der Antwort von dmckee:
quelle
-1
Syntax für head ist jedoch schon vor einiger Zeit veraltet und-n 1
sollte verwendet werden.Ich mag
echo *(om[1])
(zsh
Syntax), da dies nur den Dateinamen angibt und keinen anderen Befehl aufruft.quelle
Die Such- / Sortierlösung funktioniert hervorragend, bis die Anzahl der Dateien wirklich groß wird (wie bei einem gesamten Dateisystem). Verwenden Sie stattdessen awk, um nur die neueste Datei zu verfolgen:
quelle
Ich persönlich bevorzuge es, so wenige nicht eingebaute
bash
Befehle wie möglich zu verwenden (um die Anzahl der teuren Fork- und Exec-Systemaufrufe zu reduzieren). Um nach Datum zu sortierenls
, musste das aufgerufen werden. Aber die Verwendung vonhead
ist nicht wirklich notwendig. Ich verwende den folgenden Einzeiler (funktioniert nur auf Systemen, die Namensrohre unterstützen):oder um den Namen der ältesten Datei zu erhalten
(Beachten Sie den Abstand zwischen den beiden '<' Markierungen!)
Wenn die versteckten Dateien auch benötigt werden, könnte ein Argument hinzugefügt werden.
Ich hoffe das könnte helfen.
quelle
Wenn Sie die rekursive Option R verwenden, können Sie dies hier als Verbesserung für gute Antworten betrachten
quelle
Zeigt das zuletzt geänderte Element im Ordner an. Koppeln Sie mit
grep
, um die neuesten Einträge mit Schlüsselwörtern zu findenquelle
1
ist für die erste Zeile gleichbedeutend mithead -n 1
q?Rekursiv:
quelle
Versuchen Sie diesen einfachen Befehl
Wenn Sie möchten, dass der Dateiname zuletzt geändert wird, geben Sie path = /ab/cd/*.log ein
Wenn Sie möchten, dass der Verzeichnisname - zuletzt geändert - Pfad = / ab / cd / * /
quelle
Vorausgesetzt, Sie interessieren sich nicht für versteckte Dateien, die mit a beginnen
.
Andernfalls
quelle
Mit nur Bash-Builds, genau nach BashFAQ / 003 :
quelle
Alle diese ls / tail-Lösungen funktionieren einwandfrei für Dateien in a Verzeichnis - ohne 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 Leerzeichen (sein Vorschlag funktioniert nicht mit Leerzeichen).
Dies sollte mit allen Dateinamen funktionieren:
Dies sortiert nach Zeit, siehe Mann finden:
So ersetzen Sie einfach
%T
mit%C
zu sortieren nach Ctime.quelle
find $DIR -type f -printf "%T@ %p\n" | sort -n | cut -d' ' -f 2- | tail -n 1
Oder behalten Sie alternativ alle außer dem ersten Feld bei:find $DIR -type f -printf "%T@ %p\n" | sort -n | cut -d' ' -f 1 --complement | tail -n 1
Suchen der aktuellsten Datei in jedem Verzeichnis nach einem Muster, z. B. der Unterverzeichnisse des Arbeitsverzeichnisses, deren Name mit "tmp" endet (Groß- und Kleinschreibung wird nicht berücksichtigt):
quelle
quelle
Wenn Sie die zuletzt geänderte Datei einschließlich aller Unterverzeichnisse erhalten möchten, können Sie dies mit diesem kleinen Oneliner tun:
Wenn Sie dasselbe nicht für geänderte Dateien tun möchten, sondern für Dateien, auf die zugegriffen wird, müssen Sie einfach die ändern
% Y Parameter aus dem STAT - Befehl % X . Und Ihr Befehl für die zuletzt aufgerufenen Dateien sieht folgendermaßen aus:
Für beide Befehle können Sie auch den Parameter var = "1" ändern, wenn Sie mehr als nur eine Datei auflisten möchten.
quelle
Ich musste es auch tun und fand diese Befehle. diese arbeiten für mich:
Wenn Sie die letzte Datei nach dem Erstellungsdatum im Ordner (Zugriffszeit) haben möchten:
Und wenn Sie die letzte Datei möchten, deren Inhalt sich ändert (Zeit ändern):
quelle