Localiza arquivos que são criados um certo tempo depois ou antes de um determinado arquivo ser criado

5

Eu preciso de um script de shell que encontre arquivos que são criados 1 hora antes ou 1 hora depois que um arquivo específico ( test.txt ) foi criado.

Se eu for com find -newer , isso significa que preciso criar um arquivo temporário, usar touch para alterar o horário 1 hora antes do horário de criação do arquivo test.txt e, em seguida, usar -newer tempFile para localizar os arquivos que são mais recentes que o tempFile , encontrando os arquivos que são criados 1 hora antes do arquivo test.txt. Então eu tenho que voltar através desse processo para encontrar aqueles uma hora ou mais mais antigos do que o arquivo em que estou interessado. Isso parece ser muito trabalho extra para responder a uma pergunta simples.

Eu também vejo find -mmin , mas me preocupo que seja uma extensão para POSIX find .

Alguma outra sugestão?

    
por omarArroum 06.10.2012 / 19:36

3 respostas

4

Outra opção complicada:

  1. obtenha o tempo de modificação de test.txt ( mtime )
  2. calcule "before delta" = now + hour - mtime (assumindo que mtime está no passado)
  3. calcular "after delta" = now - hour - mtime if now - mtime > hour else 0
  4. executar find -type f -mmin -"before delta" -mmin +"after delta"

Ele encontra todos os arquivos que são modificados com menos de "antes delta" minutos atrás e maiores que "depois de delta" minutos atrás, ou seja, +/- hora em torno do tempo de modificação de test.txt .

Pode ser mais simples de entender se você desenhar now , mtime , "before" , "after" times em uma linha.

O comando

date permite obter now e mtime .

Como um verso:

$ find -type f -newermt "$(date -r $file) -1 hour" -a \
            \! -newermt "$(date -r $file) +1 hour"
    
por 06.10.2012 / 21:56
4

Tente o seguinte código de shell:

file=</PATH/TO/FILE>
date=$(perl -le '$s = (stat($ARGV[0]))[9]; print $s;' "$file")
now=$(date +%s)
seconds=$((now - date))
mins=$((seconds / 60))
find . -mmin -$((mins + 60 )) -mmin +$((mins - 60)) -print
    
por 06.10.2012 / 19:50
1

Você poderia fazer:

d=$(TZ=UTC0 date -r test.txt +%Y%m%d%H%M.%S)

ou

d=$(TZ=UTC0 find test.txt -prune -printf '%TY%Tm%Td%TH%TM.%.2TS\n'

ou

d=$(TZ=UTC0 stat -f %Sm -t %Y%m%d%H%M.%S text.txt)

Dependendo se você tem acesso ao GNU date, ao GNU find ou ao BSD stat (a idéia é que, infelizmente, não existe (razoavelmente) nenhum POSIX e uma maneira confiável de obter o tempo de modificação de um arquivo)

E então:

TZ=XXX-1 touch -t "$d" sooner
TZ=XXX+1 touch -t "$d" later
find . -newer sooner ! -newer later

O formato TZ=XXX<offset> é padrão e significa que define o fuso horário "XXX" como sendo este <offset> para UTC, portanto, o "UTC" ou "XXX" nas variáveis TZ acima são arbitrários e irrelevante.

Observe que nenhum dos find -mmin , stat , find -printf , date +%s , date -r (e muito menos --reference ) são portáveis ou POSIX.

perl é geralmente mais disponível do que qualquer um deles, e você pode fazer tudo com perl (usando File::Find ).

ksh93 ou zsh (mais facilmente) também têm a capacidade de executar toda a tarefa internamente.

Eu disse razoavelmente acima, porque é possível obter o tempo de modificação de um arquivo (como tempo de época), desde que seu nome não seja muito longo e não contenha caracteres de nova linha, POSIXly, mas é um pouco confuso:

{
  echo ibase=8
  printf '%s\n' test.txt |
    pax -x ustar -wd |
    dd 2> /dev/null bs=4 skip=34 count=3 |
    tr -d '
d=$(TZ=UTC0 date -r test.txt +%Y%m%d%H%M.%S)
' echo } | bc

Convertê-lo para um formato YYYYmmddHHMM.SS no fuso horário UTC POSIXly também é possível, mas também um esforço (consulte link como exemplo)

    
por 07.10.2012 / 22:23