Linux

使用 bash 腳本查找兩個時間戳之間的修改文件

  • May 24, 2018

我想找出在某個時間間隔之間發生變化的文件。我正在使用的腳本是

#!/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.sh是:

Thu May 24 09:26:50 UTC 2018

我應該在此腳本中更改什麼以獲得所需的行為?

顯然,sql_runner.sh(和其他文件)的時間戳在 09:26:49.000 和 09:26:49.999 之間;因此,它比 …49 更新,但不比 …50 更新。如果你想分割頭髮秒,GNU find會將時間戳比較到納秒:

/* 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' ...

引用自:https://unix.stackexchange.com/questions/445711