liste todos os arquivos mais recentes que o carimbo de data / hora e os classifique

8

Quero listar todos os arquivos (classificados por data) mais recentes que o carimbo de data / hora no formato 20130207003851somente no diretório / tmp. Os 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 fevereiro 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 touch 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
Radek
fonte
O que 2013007000385deveria representar? Eu acho que 2013 é o ano, mas como você vai 007000385para 7 de fevereiro?
Gilles 'SO- stop be evil'
@ Gilles: deveria ser 20130207003851. Não copiou corretamente ou ... desculpe por isso.
Radek

Respostas:

10

findsuporta muitos formatos de entrada de data . O formato mais simples de obter é AAAAMMDD HH: MM: SS. Você já tem os dígitos na ordem correta, tudo o que você precisa fazer é extrair o primeiro grupo ( ${timestamp%??????}: pegar todos os últimos 6 caracteres; ${timestamp#????????}pegar todos os 8 primeiros), e continuar, acrescentando pontuação e depois o próximo grupo como você vai junto.

timestamp=20130207003851
timestring=${timestamp%??????}; timestamp=${timestamp#????????}
timestring="$timestring ${timestamp%????}"; timestamp=${timestamp#??}
timestring="$timestring:${timestamp%??}:${timestamp#??}"

No bash (e ksh e zsh), mas não no ash, você pode usar a ${STRING_VARIABLE:OFFSET:LENGTH}construção mais legível .

timestring="${timestamp:0:8} ${timestamp:8:2}:${timestamp:10:2}:${timestamp:12:2}"

Para classificar os arquivos por data, imprima os nomes dos arquivos precedidos pelas datas e classifique-os e retire o prefixo da data. Use -printfpara controlar o formato de saída. imprime uma parte do tempo de modificação determinado por ; se for , você obtém o número de segundos desde a época do Unix. Abaixo, imprimo três colunas separadas por tabulação: a hora no formato classificável, o nome do arquivo e a hora no formato legível por humanos; remove a primeira coluna e a chamada para substituir a guia por espaços suficientes para acomodar todos os nomes de arquivos esperados (ajuste 40 conforme desejado). Este código pressupõe que você não tenha novas linhas ou guias nos nomes dos arquivos.%TXXX@cut -f 2-expand

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
Gilles 'SO- parar de ser mau'
fonte
apenas a parte descoberta find -newermt "$timestring" -printf '%M@\t%f %Mb %Md %MH:%MM\n'me dá saída engraçado-rwxrwxrwx@ S0002975.LOG -rwxrwxrwxb -rwxrwxrwxd -rwxrwxrwxH:-rwxrwxrwxM
Radek
@Radek Desculpe, é %Tpara o mtime, %Msão as permissões.
Gilles 'SO- stop be evil'
Bonita. Funciona sem problemas. Meu código final é que find /tmp -maxdepth 1 -type f -newermt "20130207 00:38:51" -printf '%T@\t%f-%Tb %Td %TH:%TM\n' | sort -k1n | cut -f 2-eu separei o nome e o tempo do arquivo -porque capturarei a saída em php e usarei - como separador. Muito obrigado.
Radek
@Gilles é impressionante, mas se você explicar timestring, ele vai ajudar muito mais ..
Rahul Patil
@RahulPatil Done. Eu também adicionei um método bash mais legível.
Gilles 'SO- stop be evil'
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)

Os newerfunção retorna TRUE para arquivos mais novos que $timestamp(nota que zsh's zstatnão suporta a precisão subsecond embora).

Então, tudo o que fazemos é usar zshqualificadores de globbing: Dpara incluir arquivos de ponto, .considerar apenas arquivos regulares, Omsolicitar tempo de modificação e +newerchamar a newerfunção para determinar qual arquivo selecionar.

Se você deseja exibir também os carimbos de data e hora do arquivo, é possível alterar newerpara:

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

Observe que o resultado da geração do nome do arquivo incluirá os carimbos de data e hora, o que significa que você não pode mais usá-los como nomes de arquivos.

Stéphane Chazelas
fonte
isso não vai funcionar ssh, por exemplo.
precisa saber é