特定のファイルが生成された後または特定の時間より前に生成されたファイルを見つける

特定のファイルが生成された後または特定の時間より前に生成されたファイルを見つける

test.txt特定のファイル()が生成される1時間前または1時間後に生成されたファイルを見つけるには、シェルスクリプトが必要です。

を選択すると、find -newer一時ファイルを作成し、touch変更ファイルの作成時間の1時間前の時間を使用し、次に最新のファイル検索をtest.txt使用し、最後にtest.txtファイルの1時間前に生成されたファイルを見つける必要があります。その後、それを見つけるためにすべてのコースを再利用するのに1時間以上費やす必要があります。-newer tempFiletempFile年をとる私が興味のあるファイルよりも簡単な質問に答えるのは、多くの追加作業のようです。

私も見たことがありますが、find -mminPOSIX拡張ではないか心配ですfind

他に提案がありますか?

答え1

次のシェルコードを試してください。

file=</PATH/TO/FILE>
date=$(perl -le '$s = (stat($ARGV[0]))[9]; print $s;' "$file")
now=$(date +%s)
seconds=$((now - date))
mins=$((seconds / 60))
find . -mmin -$((mins + 60 )) -mmin +$((mins - 60)) -print

答え2

別の複雑なオプション:

  1. test.txtの修正時間(mtime)を取得します。
  2. 計算する"before delta" = now + hour - mtimemtime過去を仮定)
  3. 計算する"after delta" = now - hour - mtime if now - mtime > hour else 0
  4. 走るfind -type f -mmin -"before delta" -mmin +"after delta"

「前」分より前に変更されたすべてのファイルと、「後」分より大きい分、つまりtest.txt変更時間+/-時間の前に変更されたすべてのファイルを探します。

nowmtime、、"before"時間を線で描くと"after"わかりやすくなります。

dateこのコマンドを使用するとnowmtime

一行で:

$ find -type f -newermt "$(date -r $file) -1 hour" -a \
            \! -newermt "$(date -r $file) +1 hour"

答え3

次のことができます。

d=$(TZ=UTC0 date -r test.txt +%Y%m%d%H%M.%S)

または

d=$(TZ=UTC0 find test.txt -prune -printf '%TY%Tm%Td%TH%TM.%.2TS\n'

または

d=$(TZ=UTC0 stat -f %Sm -t %Y%m%d%H%M.%S text.txt)

GNUの日付、GNUの検索、またはBSD統計へのアクセス権があるかどうかによって異なります(残念ながら(合理的に)POSIXがなく、ファイルの修正時間を取得する信頼できる方法はありません)

それから:

TZ=XXX-1 touch -t "$d" sooner
TZ=XXX+1 touch -t "$d" later
find . -newer sooner ! -newer later

形式TZ=XXX<offset>は標準です。定義「XXX」タイムゾーン<offset>はUTCに基づいているため、上記のTZ変数の「UTC」または「XXX」は任意であり、関連性はありません。

、、、、(は言うまでもなく)はfind -mminすべてstat移植可能でfind -printfあるかdate +%sPOSIXです。date -r--reference

perl通常、どちらかより広く利用可能であり、Perlを使用してすべての操作を実行できます(File::Find)。

ksh93またはzsh(より簡単に)全体の作業を社内で実行する能力も備えています。

私は言った合理的に上記では、ファイル名が長すぎず、改行文字を含まない限り、ファイルの修正時間(エポック時間)を取得できるため、POSIXlyですが少し複雑です。

{
  echo ibase=8
  printf '%s\n' test.txt |
    pax -x ustar -wd |
    dd 2> /dev/null bs=4 skip=34 count=3 |
    tr -d '\0'
  echo
} | bc

UTCタイムゾーンPOSIXlyからYYYYmmddHHMM.SS形式に変換することも可能ですが、かなり困難です(参照)http://stchaz.free.fr/wide_strftime.sh例えば)

関連情報