Sim, você pode fazer isso com o GNU find
. Se os nomes dos seus arquivos não contiverem novas linhas, você pode fazer:
find -printf '%T@ %p\n' | sort -gk1,1
Explicação
-
A opção
-printf
defind
pode imprimir todos os tipos de informações. Neste caso, estamos usando:%Tk File's last modification time in the format specified by k, which is the same as for %A. @ seconds since Jan. 1, 1970, 00:00 GMT, with fractional part. %p File's name.
Portanto,
%T@ %p\n
imprimirá o tempo de modificação do arquivo em segundos desde a época (%T@
), um espaço e, em seguida, o nome do arquivo (%p
). -
Estes são então passados para
sort
, que é ordenado a ordenar numericamente (-n
) apenas no primeiro campo (-k1,1
).
Observe que isso retornará todos os arquivos e diretórios. Para restringi-lo apenas a arquivos regulares (sem diretórios, arquivos de dispositivos, links, etc.), adicione -type f
ao seu comando find
.
Para obter datas legíveis, você pode processar a saída com o GNU date
:
find -printf '%T@ %p\t\n' | sort -gk1,1 |
perl -lne 's/([^ ]*)//;chomp($i='date -d \@$1'); print "$i $_"'
Aqui, o comando perl
substitui a primeira cadeia de caracteres não espaciais (a data) por si própria, conforme processada pelo GNU date
.
Os itens acima falharão para nomes de arquivos que contenham novas linhas. Para lidar com novas linhas, use:
find -printf '%p\t%T@find -printf '%T@ %p\n' | sort -gk1,1
' | sort -zt$'\t' -nk2 | tr '%Tk File's last modification time in the format specified by
k, which is the same as for %A.
@ seconds since Jan. 1, 1970, 00:00 GMT, with fractional part.
%p File's name.
' '\n'
Essa é a mesma coisa, exceto que find
produzirá um
em vez de \n
sort
no final de cada nome de arquivo. O GNU tr
pode lidar com a saída separada por nulo, portanto, ainda é capaz de classificar corretamente. O comando final
traduz o %code% de volta para %code% . \n