我想找出在某个时间间隔内发生更改的文件。我正在使用的脚本是
#!/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:50
到2018-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.sh
Gives 的输出是:
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' ...