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/ tailbasiert basiert, fehlerhaft.
Bei GNU lsbesteht eine weitere Option darin, die --quoting-style=shell-alwaysOption und ein bashArray zu verwenden:
eval "files=($(ls -t --quoting-style=shell-always))"
((${#files[@]} > 0)) && printf '%s\n' "${files[0]}"
(Fügen Sie die -AOption hinzu, lswenn 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 zshGlob-Qualifikationsmerkmale zu verwenden, anstatt bashall 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 ( compinitund 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 cDatei.
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