Encontre arquivos modificados entre dois timestamps usando o script bash

1

Eu quero descobrir os arquivos que mudaram entre alguns intervalos. Script que estou usando é

#!/bin/bash
find ./ -type f -newermt '2018-05-24 09:26:50' ! -newermt '2018-05-24 09:26:52'

Minha pasta contém os seguintes arquivos:

-rwxr-xr-x 1 root root  219 May 24 09:26 sql_runner.sh
-rwxr-xr-x 1 root root 3.6K May 24 09:26 script.sh
-rwxr-xr-x 1 root root 3.1K May 24 09:26 script_ide.sh
-rwxr-xr-x 1 root root 8.8K May 24 09:26 q
-rw-r--r-- 1 root root   17 May 24 09:26 program.txt
-rw-r--r-- 1 root root  346 May 24 09:26 main.c
drwx------ 2 root root  12K May 24 09:26 lost+found
-rwxr-xr-x 1 root root 1.7K May 24 09:26 javaRunner.sh
-rw-r--r-- 1 root root    0 May 24 09:26 inputParams
-rw-r--r-- 1 root root    2 May 24 09:26 inputForInfinite
-rw-r--r-- 1 root root   14 May 24 09:26 inputFile

Quando eu executo o script acima, ele não retorna nada, mas quando eu mudo o script para este

#!/bin/bash
find ./ -type f -newermt '2018-05-24 09:26:49' ! -newermt '2018-05-24 09:26:52'

i.e. diminuindo o tempo em 1 segundo (de 2018-05-24 09:26:50 para 2018-05-24 09:26:49 ), isso me dá o resultado necessário:

./inputFile
./main.c
./sql_runner.sh
./script_ide.sh
./q
./inputForInfinite
./javaRunner.sh
./program.txt
./inputParams
./script.sh

Por que estou tendo esse comportamento porque a saída de date -r ./sql_runner.sh é:

Thu May 24 09:26:50 UTC 2018

O que devo mudar neste script para ter o comportamento desejado?

    
por user8756809 24.05.2018 / 11:48

1 resposta

0

Aparentemente, o timestamp de sql_runner.sh (e os outros arquivos) está entre 09: 26: 49.000 e 09: 26: 49.999; portanto, é mais recente que ... 49 mas não mais recente que ... 50. Se você quiser dividir hairs segundos, GNU encontrar irá comparar os timestamps até o nanossegundo:

/* Returns ts1 - ts2 */
static double ts_difference (struct timespec ts1,
                 struct timespec ts2)
{
  double d =  difftime (ts1.tv_sec, ts2.tv_sec)
    + (1.0e-9 * (ts1.tv_nsec - ts2.tv_nsec));
  return d;
}


static int
compare_ts (struct timespec ts1,
        struct timespec ts2)
{
  if ((ts1.tv_sec == ts2.tv_sec) &&
      (ts1.tv_nsec == ts2.tv_nsec))
    {
      return 0;
    }
  else
    {
      double diff = ts_difference (ts1, ts2);
      return diff < 0.0 ? -1 : +1;
    }
}

Você estava perto com a sintaxe; use um período para adicionar os segundos fracionários, não outro cólon:

find ./ -type f -newermt '2018-05-24 09:26:50.200' ...
    
por 24.05.2018 / 15:00