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