Uwaga dotycząca niezawodności:
Ponieważ znak nowego wiersza jest tak samo ważny jak każdy inny w nazwie pliku, każde rozwiązanie, które opiera się na wierszach, takich jak te oparte na head/ tail, jest wadliwe.
W przypadku GNU lsinną opcją jest użycie --quoting-style=shell-alwaysopcji i bashtablicy:
eval "files=($(ls -t --quoting-style=shell-always))"
((${#files[@]} > 0)) && printf '%s\n' "${files[0]}"
(dodaj -Aopcję, lsjeśli chcesz również uwzględnić pliki ukryte).
Jeśli chcesz ograniczyć się do zwykłych plików (zignoruj katalogi, kolejki linowe, urządzenia, dowiązania symboliczne, gniazda ...), będziesz musiał odwołać się do GNU find.
Z bash 4.4 lub nowszym (dla readarray -d) i GNU coreutils 8.25 lub nowszym (dla 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]}"
Lub rekurencyjnie:
readarray -t -d '' files < <(
LC_ALL=C find . -name . -o -name '.*' -prune -o -type f -printf '%T@%p\0' |
sort -rzn | cut -zd/ -f2-)
Najlepiej byłoby tutaj użyć zshi jego kwalifikatorów glob, zamiast bashuniknąć tego całego kłopotu:
Najnowszy zwykły plik w bieżącym katalogu:
printf '%s\n' *(.om[1])
W tym ukryte:
printf '%s\n' *(D.om[1])
Drugi najnowszy:
printf '%s\n' *(.om[2])
Sprawdź wiek pliku po rozwiązaniu dowiązania symbolicznego:
printf '%s\n' *(-.om[1])
Rekurencyjnie:
printf '%s\n' **/*(.om[1])
Ponadto, z compinitwłączonym systemem uzupełniania ( i co), Ctrl+Xmprogram uzupełniający, który rozwija się do najnowszego pliku.
Więc:
vi Ctrl+Xm
Zmusiłby Cię do edycji najnowszego pliku (masz również szansę zobaczyć, który z nich zostanie przed naciśnięciem Return).
vi Alt+2Ctrl+Xm
Dla drugiego najnowszego pliku.
vi * .cCtrl+Xm
dla najnowszego cpliku.
vi * (.)Ctrl+Xm
dla najnowszego zwykłego pliku (nie katalogu, ani fifo / device ...) i tak dalej.
watch -n1 'ls -Art | tail -n 1'- pokazuje ostatnie pliki