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 ein bash
Array zu verwenden:
eval "files=($(ls -t --quoting-style=shell-always))"
((${#files[@]} > 0)) && printf '%s\n' "${files[0]}"
(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ür cut -z
):
readarray -t -d '' files < <(
LC_ALL=C find . -maxdepth 1 -type f ! -name '.*' -printf '%T@/%f\0' |
sort -rzn | cut -zd/ -f2)
((${#files[@]} > 0)) && printf '%s\n' "${files[0]}"
Oder rekursiv:
readarray -t -d '' files < <(
LC_ALL=C find . -name . -o -name '.*' -prune -o -type f -printf '%T@%p\0' |
sort -rzn | cut -zd/ -f2-)
Am besten wäre es, die zsh
Glob-Qualifikationsmerkmale zu verwenden, anstatt bash
all diesen Ärger zu vermeiden:
Neueste reguläre Datei im aktuellen Verzeichnis:
printf '%s\n' *(.om[1])
Einschließlich versteckter:
printf '%s\n' *(D.om[1])
Zweitneueste:
printf '%s\n' *(.om[2])
Überprüfen Sie das Alter der Datei nach der Symlink-Auflösung:
printf '%s\n' *(-.om[1])
Rekursiv:
printf '%s\n' **/*(.om[1])
Wenn das Vervollständigungssystem ( compinit
und Co) aktiviert ist, Ctrl+Xmwird es zu einem Vervollständiger, der auf die neueste Datei erweitert wird.
So:
vi Ctrl+Xm
Sie würden die neueste Datei bearbeiten (Sie können auch sehen, welche sie ist, bevor Sie drücken Return).
vi Alt+2Ctrl+Xm
Für die zweitneueste Datei.
vi * .cCtrl+Xm
für die neueste c
Datei.
vi * (.)Ctrl+Xm
für die neueste reguläre Datei (weder Verzeichnis noch FIFO / Gerät ...) und so weiter.
watch -n1 'ls -Art | tail -n 1'
- zeigt die allerletzten Dateien