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: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.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' ...

おすすめ記事