Una nota sull'affidabilità:
Poiché il carattere di nuova riga è valido come qualsiasi in un nome di file, qualsiasi soluzione che si basa su linee come head
/tail
quelle basate su è difettosa.
Con GNU ls
, un'altra opzione è usare l' --quoting-style=shell-always
opzione e un bash
array:
eval "files=($(ls -t --quoting-style=shell-always))"
((${#files[@]} > 0)) && printf '%s\n' "${files[0]}"
(aggiungi l' -A
opzione als
se vuoi considerare anche i file nascosti).
Se si desidera limitare a file regolari (ignorare directory, fifo, dispositivi, collegamenti simbolici, socket ...), è necessario ricorrere a GNU find
.
Con bash 4.4 o successivo (per readarray -d
versioni ) e GNU coreutils 8.25 o versioni successive (per 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]}"
O ricorsivamente:
readarray -t -d '' files < <(
LC_ALL=C find . -name . -o -name '.*' -prune -o -type f -printf '%T@%p\0' |
sort -rzn | cut -zd/ -f2-)
Il migliore qui sarebbe usare zsh
e le sue qualificazioni glob invece di bash
evitare tutto questo fastidio:
File regolare più recente nella directory corrente:
printf '%s\n' *(.om[1])
Di cui quelli nascosti:
printf '%s\n' *(D.om[1])
Secondo più recente:
printf '%s\n' *(.om[2])
Controlla l'età dei file dopo la risoluzione del collegamento simbolico:
printf '%s\n' *(-.om[1])
ricorsivamente:
printf '%s\n' **/*(.om[1])
Inoltre, con il sistema di completamento (compinit
e co) abilitato,Ctrl+Xm diventa un completatore che si espande nel file più recente.
Così:
VI Ctrl+Xm
Ti farebbe modificare il file più recente (avrai anche la possibilità di vedere quale prima di premere Return ).
VI Alt+2Ctrl+Xm
Per il secondo file più recente.
vi * .cCtrl+Xm
per il più recente c
file .
vi * (.)Ctrl+Xm
per il file regolare più recente (non directory, né fifo / dispositivo ...) e così via.
watch -n1 'ls -Art | tail -n 1'
- mostra gli ultimi file