web-dev-qa-db-ja.com

特定のファイルが作成された後または前の特定の時間に作成されたファイルを検索する

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

find -newerを使用する場合、つまり一時ファイルを作成する必要があることを意味します。touchを使用して、test.txtファイルの作成時刻の1時間前の時刻を変更します。次に-newer tempFileを使用してtempFileよりも新しいファイルを見つけ、最終的にtest.txtファイルの1時間前に作成されたファイルを見つけます。次に、そのプロセスをもう一度調べて、関心のあるファイルよりも1時間以上olderを見つける必要があります。簡単な質問に答えるには、多くの追加作業が必要なようです。

find -mminも表示されますが、これはPOSIX findの拡張機能であることを心配しています。

他に何か提案はありますか?

5
omarArroum

別の複雑なオプション:

  1. test.txtの変更時刻を取得(mtime
  2. "before delta" = now + hour - mtimeを計算します(mtimeが過去のものであると想定)
  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コマンドを使用すると、nowおよびmtimeを取得できます。

ワンライナーとして:

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

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

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
4
Gilles Quenot

あなたはできる:

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 date、GNU findまたはBSD statにアクセスできるかどうかに応じて(残念なことに、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に定義する定義することを意味するため、 "UTC上記のTZ変数の "または" XXX "は任意であり、無関係です。

find -mminstatfind -printfdate +%sdate -r--referenceはもちろん)は、移植性もPOSIXもないことに注意してください。

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

POSIXlyのUTCタイムゾーンでYYYYmmddHHMM.SS形式に変換することも可能ですが、かなり手間がかかります(例として http://stchaz.free.fr/wide_strftime.sh を参照)

1