find
suporta muitos formatos de entrada de data . O formato mais simples para obter é YYYYMMDD HH: MM: SS. Você já tem os dígitos na ordem correta, tudo o que você precisa fazer é extrair o primeiro grupo ( ${timestamp%??????}
: leve todos menos os últimos 6 caracteres; ${timestamp#????????}
: leve todos menos os 8 primeiros caracteres), e continue, acrescentando pontuação e depois o próximo grupo.
timestamp=20130207003851
timestring=${timestamp%??????}; timestamp=${timestamp#????????}
timestring="$timestring ${timestamp%????}"; timestamp=${timestamp#??}
timestring="$timestring:${timestamp%??}:${timestamp#??}"
No bash (e ksh e zsh), mas não em cinza, você pode usar o constructo ${STRING_VARIABLE:OFFSET:LENGTH}
mais legível.
timestring="${timestamp:0:8} ${timestamp:8:2}:${timestamp:10:2}:${timestamp:12:2}"
Para classificar arquivos por data, imprima os nomes dos arquivos precedidos pelas datas e classifique-os e, em seguida, retire o prefixo de data. Use -printf
para controlar o formato de saída. %TX
imprime uma parte do tempo de modificação determinado por X
; se X
for @
, você terá o número de segundos desde a época do Unix. Abaixo, imprimo três colunas separadas por tabulações: a hora no formato classificável, o nome do arquivo e a hora em formato legível por humanos; cut -f 2-
remove a primeira coluna e a chamada para expand
substitui a guia por espaços suficientes para acomodar todos os nomes de arquivos esperados (ajuste 40 conforme desejado). Este código assume que você não tem novas linhas ou guias nos nomes de arquivos.
find -maxdepth 1 -type f \
-newermt "$timestring" -printf '%T@\t%f\t%Tb %Td %TH:%TM\n' |
sort -k1n |
cut -f 2- |
expand -t 40