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 ls
inną opcją jest użycie --quoting-style=shell-always
opcji i bash
tablicy:
eval "files=($(ls -t --quoting-style=shell-always))"
((${#files[@]} > 0)) && printf '%s\n' "${files[0]}"
(dodaj -A
opcję, ls
jeś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ć zsh
i jego kwalifikatorów glob, zamiast bash
uniknąć 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 compinit
włą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 c
pliku.
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