使用 bash 脚本查找 2 个时间戳之间修改的文件

使用 bash 脚本查找 2 个时间戳之间修改的文件

我想找出在某个时间间隔内发生更改的文件。我正在使用的脚本是

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

我的文件夹包含以下文件:

-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

当我运行上面的脚本时,它不会返回任何内容,但是当我将脚本更改为此时

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

即减少时间 1 秒(从2018-05-24 09:26:502018-05-24 09:26:49),它给了我所需的结果:

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

为什么我会有这样的行为,因为date -r ./sql_runner.shGives 的输出是:

Thu May 24 09:26:50 UTC 2018

我应该在此脚本中更改什么才能获得所需的行为?

答案1

sql_runner.sh显然, (以及其他文件)的时间戳在 09:26:49.000 和 09:26:49.999 之间;因此,它比 ...49 新,但不比 ...50 新。如果你想分秒必争GNU 查找将比较时间戳到纳秒:

/* 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;
    }
}

你很接近与语法;使用句点添加秒小数部分,而不是另一个冒号:

find ./ -type f -newermt '2018-05-24 09:26:50.200' ...

相关内容