Supondo que você tenha acesso às ferramentas GNU (se você estiver executando o Linux), eu usaria stat . Por exemplo:
$ ls -l
total 0
-rw-r--r-- 1 terdon terdon 0 Sep 15 16:49 file1
-rw-r--r-- 1 terdon terdon 0 Sep 15 16:39 file2
-rw-r--r-- 1 terdon terdon 0 Sep 15 16:29 file3
-rw-r--r-- 1 terdon terdon 0 Sep 15 16:19 file4
-rw-r--r-- 1 terdon terdon 0 Sep 15 16:09 file5
-rw-r--r-- 1 terdon terdon 0 Sep 15 15:59 file6
-rw-r--r-- 1 terdon terdon 0 Sep 15 15:49 file7
Portanto, o quinto arquivo mais recente é file5 . Para imprimir apenas isso, você pode fazer:
$ stat --printf '%Y %nnthfile() {
stat --printf '%Y %n$ ls -l
total 0
-rw-r--r-- 1 terdon terdon 0 Sep 15 16:49 file1
-rw-r--r-- 1 terdon terdon 0 Sep 15 16:39 file2
-rw-r--r-- 1 terdon terdon 0 Sep 15 16:29 file3
-rw-r--r-- 1 terdon terdon 0 Sep 15 16:19 file4
-rw-r--r-- 1 terdon terdon 0 Sep 15 16:09 file5
-rw-r--r-- 1 terdon terdon 0 Sep 15 15:59 file6
-rw-r--r-- 1 terdon terdon 0 Sep 15 15:49 file7
' * | sort -zrnk1 |
awk -vRS='$ stat --printf '%Y %nnthfile() {
stat --printf '%Y %n%pre%' * | sort -zrnk1 |
awk -vRS='%pre%' -vn="$1" 'NR==n{sub(/^[^ ]* /,"",$0); print}'
}
' * | sort -zrnk1 |
awk -vRS='%pre%' 'NR==5{sub(/^[^ ]* /,"",$0); print}'
' -vn="$1" 'NR==n{sub(/^[^ ]* /,"",$0); print}'
}
' * | sort -zrnk1 |
awk -vRS='%pre%' 'NR==5{sub(/^[^ ]* /,"",$0); print}'
Você poderia então facilmente fazer isso em uma função de shell que pode levar N (5 no seu exemplo) como um argumento. Basta adicionar essas linhas ao seu ~/.bashrc ou equivalente:
%pre%
Observe que isso também mostrará os diretórios. Se você precisar dele para coincidir com os arquivos ocultos, bem como executar (supondo que você está usando o bash) shopt -s dotglob antes do comando acima.
Explicação
-
stat --printf '%Y %n%s' * : para cada arquivo ou diretório na pasta atual, imprima a data de modificação em segundos desde a época ( %n ) e o nome do arquivo ( \n ) e termine cada linha com sort -zrnk1 em vez de -r . Isso nos permite lidar corretamente com nomes de arquivos contendo caracteres de nova linha.
-
-z : ordena a saída na ordem inversa ( sort ), do mais recente para o mais velho. O -n indica -k1 para esperar linhas de entrada com terminação nula. O awk diz para classificar numericamente e o -vRS='vn=$1' para considerar apenas o primeiro campo ao classificar.
-
%código%:
-
n : defina o separador de registro de entrada (linha) como NR==n{} ;
-
n : defina a variável sub(/^[^ ]* /,"",$0); print para o que foi dado como entrada para a função;
-
^[^ ]* : execute isso somente na linha %code% (5 no primeiro exemplo);
-
%code% : substitui todos os caracteres não espaciais do início da linha ( %code% ) até o primeiro espaço e imprime o resultado