Tipo de arquivo por questão de tempo

0

Eu tenho um requisito para identificar a lacuna de seqüência em um conjunto de arquivos. A sequência começa em FILENAME_0001 e termina em FILENAME_9999. Depois disso, a sequência é reiniciada a partir de 0001.

Para implementar uma verificação de sequência adequada, usei ls -rt para selecionar os arquivos na ordem do tempo modificado e compará-los com o número de sequência dos arquivos anteriores. Se o arquivo anterior foi 9999, eu verifico se o próximo é 0001 (para acomodar a redefinição da seqüência).

Recentemente, deparei com um cenário em que os arquivos foram listados na ordem abaixo:

FILENAME_0001 
FILENAME_0002
FILENAME_0005
FILENAME_0003
FILENAME_0004
FILENAME_0006
FILENAME_0007

Isso ocorreu porque os arquivos 3, 4 e amp; 5 tiveram o mesmo tempo modificado para o segundo. Apenas o milissegundo era diferente. Então estou supondo que o ls -rt considere apenas os segundos. Alguém poderia sugerir uma solução alternativa?

    
por Mathew Paret 11.02.2016 / 08:31

2 respostas

1

Se o seu find tiver printf , imprima o mtime em segundos, seguido do nome do arquivo, use sort e, finalmente, cut :

find . -type f -printf "%T@\t%f\n" |
sort -k 1n -k 2 |
cut -f 2-

O resultado encontra TIMESTAMP FILENAME em cada linha. O tipo primeiro classifica os registros de data e hora em ordem numérica. Se os timestamps forem iguais, ele usará o nome do arquivo como último recurso. O corte remove o registro de data e hora da saída.

EDIT: Sua solução perl funciona, mas eu faria diferente. Aqui está o mais simples:

find . -type f -print | 
perl -lne 'print (((stat($_))[9]."\t".$_)' |
sort -k 1n -k 2 |
cut -f 2-

Não há necessidade de converter o tempo em uma string e vice-versa. Apenas imprima o mtime do stat como um valor numérico como o find teria feito.

    
por 11.02.2016 / 12:01
1

Finalmente consegui trabalhar. Eu usei o código abaixo:

for FILENAME in $(ls...); do
FILE_TIME=$(perl -e '@d=localtime ((stat(shift))[9]); printf "%4d%02d%02d%02d%02d%02d\n", $d[5]+1900,$d[4]+1,$d[3],$d[2],$d[1],$d[0]' $FILENAME)
echo "$FILE_TIME $FILENAME"
done | sort -k 1n -k 2 | cut -d" " -f2

Eu uso o sistema HP-UX.

    
por 12.02.2016 / 08:06

Tags