特定のファイル(test.txt
)が作成される1時間前または1時間後に作成されたファイルを見つけるシェルスクリプトが必要です。
find -newer
を使用する場合、つまり一時ファイルを作成する必要があることを意味します。touch
を使用して、test.txt
ファイルの作成時刻の1時間前の時刻を変更します。次に-newer tempFile
を使用してtempFile
よりも新しいファイルを見つけ、最終的にtest.txtファイルの1時間前に作成されたファイルを見つけます。次に、そのプロセスをもう一度調べて、関心のあるファイルよりも1時間以上olderを見つける必要があります。簡単な質問に答えるには、多くの追加作業が必要なようです。
find -mmin
も表示されますが、これはPOSIX find
の拡張機能であることを心配しています。
他に何か提案はありますか?
別の複雑なオプション:
test.txt
の変更時刻を取得(mtime
)"before delta" = now + hour - mtime
を計算します(mtime
が過去のものであると想定)"after delta" = now - hour - mtime if now - mtime > hour else 0
を計算するfind -type f -mmin -"before delta" -mmin +"after delta"
を実行します「デルタ前」分未満で「デルタ後」分より前に変更されたすべてのファイル、つまりtest.txt
の変更時刻の前後+/-時間をすべて検出します。
線上にnow
、mtime
、"before"
、"after"
回描画すると、理解が簡単になる可能性があります。
date
コマンドを使用すると、now
およびmtime
を取得できます。
ワンライナーとして:
$ find -type f -newermt "$(date -r $file) -1 hour" -a \
\! -newermt "$(date -r $file) +1 hour"
次のシェルコードを試してください。
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
あなたはできる:
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 -mmin
、stat
、find -printf
、date +%s
、date -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 を参照)