listar todos os arquivos mais novos que o timestamp fornecido e classificá-los

6

Eu quero listar todos os arquivos (classificados por data) que são mais recentes que timestamp no formato 20130207003851 no diretório / tmp apenas. Subdiretórios podem ser omitidos.

Usando o SUSE Linux Enterprise Server 11.

O formato de saída deve ser

S0002948.LOG Feb  7 03:28 
S0002935.LOG Feb  7 05:58 
S0002952.LOG Feb  7 09:58 
S0002940.LOG Feb  7 11:58 

find / tmp -newermt "7 de fev de 2013" -ls lista os arquivos que eu quero, mas

  • como posso usar o registro de data e hora em um formato 20130207003851
  • como posso classificar a saída?
  • como posso exibir apenas o nome e a data do arquivo. Nome do arquivo primeiro e depois a data?

ps Eu não quero usar o toque para criar um arquivo de referência para encontrar

pss

find -newermt "20130207003851" -ls
find: I cannot figure out how to interpret '20130207003851' as a date or time
    
por Radek 12.02.2013 / 01:38

2 respostas

8

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
    
por 12.02.2013 / 02:17
5

com zsh :

zmodload zsh/stat
newer() {
  local t
  zstat -A t -F %Y%m%d%H%M%S +mtime -- $REPLY && (( t >= timestamp ))
}
timestamp=20130207003851
print -rl -- /tmp/*(D.Om+newer)

A função newer retorna true para arquivos mais recentes que $timestamp (observe que zsh ' zstat não suporta precisão de subsegundo).

Então, tudo o que fazemos é usar zsh qualificadores de globbing: D para incluir arquivos de ponto, . para considerar apenas arquivos regulares, Om para solicitar no momento da modificação e +newer para chamar o newer function para determinar qual arquivo selecionar.

Se você quiser exibir os registros de data e hora do arquivo, pode alterar newer para:

newer() {
  local t
  zstat -A t -F %Y%m%d%H%M%S +mtime -- $REPLY &&
    REPLY+=$'\t'$t &&
    (( t >= timestamp ))
}

Note, entretanto, que o resultado da geração do nome do arquivo incluirá os timestamps, o que significa que você não pode mais usá-los como nomes de arquivos.

    
por 12.02.2013 / 23:46