test.txt
特定のファイル()が生成される1時間前または1時間後に生成されたファイルを見つけるには、シェルスクリプトが必要です。
を選択すると、find -newer
一時ファイルを作成し、touch
変更ファイルの作成時間の1時間前の時間を使用し、次に最新のファイル検索をtest.txt
使用し、最後にtest.txtファイルの1時間前に生成されたファイルを見つける必要があります。その後、それを見つけるためにすべてのコースを再利用するのに1時間以上費やす必要があります。-newer tempFile
tempFile
年をとる私が興味のあるファイルよりも簡単な質問に答えるのは、多くの追加作業のようです。
私も見たことがありますが、find -mmin
POSIX拡張ではないか心配です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
別の複雑なオプション:
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"
答え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 +%s
POSIXです。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例えば)