特定の時間間隔内に変更されたファイルを探したいです。私が使用するスクリプトは
#!/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' ...