ファイルがx時間以上前に作成されたかどうかをbashでチェックインするにはどうすればよいですか?


106

Linuxのbashで、ファイルがx時間以上前に作成されたかどうかを確認したい。

ファイルの名前がtext.txtで、時間が2時間だとします。

 if [ what? ]
 then
     echo "old enough"
 fi

回答:


138

変更時間のみ

if test `find "text.txt" -mmin +120`
then
    echo old enough
fi

-cmin変更または-aminアクセス時間に使用できます。他の人が指摘したように、作成時間を追跡することはできないと思います。


3
「テスト」とバックティックをドロップできます。これは 'if(test == true)'と 'if(test)'に似ています
ガン

2
あなたは正しいです。find一致が見つからないときにゼロ以外を返すと思っていたと思います。

4
バックティックをドロップして、テスト$(find text.txt -mmin +120)
tommy.carstensen

1
@BroSlowの見栄えが良くなります。「複数」はあり得ません。もちろん、text.txtディレクトリではないと推定されます。
kmkaplan 2014

2
私はこの構文を好む:[ "$(find path/to/file -mmin +120)" ] && echo "it is old"
Alfe

42

私はいつもdate -r /the/file +%sその年齢を見つけるのに使うのが好きでした。

またtouch --date '2015-10-10 9:55' /tmp/file、任意の日付/時刻で非常に細かい時刻を取得することもできます。


今日も同じものを探していました。ベスト!
Umair A. 2014

ありがとう。「ファイルbashの古さを出力する方法」をググったので、このSOの質問にたどり着きました。これがまさに私が探していたものです!
Noah Sussman、2015

5
ありがとう!上記はタイムスタンプ(年齢ではない)であるという唯一の注意点がありますが、let AGE=$(($(date +%s)-$(date -r /path/to/file +%s))) [このように 作成および変更されていない、または「modに対する年齢」という仮定で)年齢の
計算に使用でき

function file-age { FILE_CREATED_TIME=`date -r "$1" +%s`; TIME_NOW=`date +%s`; echo "$[ ${TIME_NOW} - ${FILE_CREATED_TIME} ]"; }
turiyag

1
@turiyag必須のメモで$[ ]あり、非推奨ではない場合でも、少なくとも古くて移植性が低く$(( ))代わりに使用する必要があります。と逆引用符は、よりも壊れやすいです$( )。また、関数名のハイフンは完全に移植できない場合があります。でもその本質は良いです!
michaelb958--GoFundMonica

23

を使用しstatてファイルの最終変更日dateを把握し、現在の時刻とバシズムの寛大な使用を把握するには、ファイルの最終変更日時1に基づいて必要なテストを実行できます。

if [ "$(( $(date +"%s") - $(stat -c "%Y" $somefile) ))" -gt "7200" ]; then
   echo "$somefile is older then 2 hours"
fi

コードはfindアプローチよりも少し読みにくくなりfindますが、すでに「見つけた」ファイルを調べるために実行すると、より良いアプローチだと思います。また、日付の操作は楽しいです;-)


  1. Philが作成時間を正しく記録していないので%Z%Y以下の代わりに使用して、「変更時間」を取得してください。

[更新]

Macユーザーの場合、stat -f "%m" $somefile上記のLinux固有の構文の代わりに使用します


日付と統計はどのシェルに組み込まれていますか?私のbash(GNU、3.2.48)にはありません。
Ian Clelland

おっと、ごめんなさい。stat組み込みではありません-私の非常に悪い、私は修正します。
Guss 9:45

1
@Gussの正しい解決策は、brewでcoretutilsをインストールすることです。:-)
エリックヨハンソン

1
@ErikJohansson既存のソフトウェアを使用するときに追加のソフトウェアをインストールする必要がないようにしたいのですが、これはWindowsではありません;-)
Guss

1
これを使用したいがそれを変更したい人にとって、それが何をしているのかを正確に知っていると良いでしょう:$(($(date + "%s")-1970-01-01 00:00:00 UTCからの秒数(エポック)$(stat -c "%Y" $ somefile)))-最終変更時刻(エポック-gt "7200"以降の秒数)-差がx秒数より大きいかどうかを確認します。
devo

16

作成時刻は保存されません。

保存されるのは、3つのタイムスタンプです(通常、特定のファイルシステムまたは特定のファイルシステムオプションでオフにできます)。

  • 最終アクセス時間
  • 最終変更時刻
  • 最終変更時刻

ファイルへの「変更」は、権限の変更、名前の変更などとしてカウントされます。変更は内容のみです。


12

ctimeは技術的には作成時ではありませんが、多くの場合そうです。

ctimeはファイルの内容の変更による影響を受けないため、通常はファイルが作成されたときにのみ更新されます。そして、はい-すべての叫び声が聞こえます-アクセス許可または所有権を変更した場合にも更新されますが、通常は、ファイルをそこに配置すると同時に、通常は一度実行されます。

個人的に私は常にすべてに対してmtimeを使用しています。しかし、とにかく...使いやすい関数で、Gussの「魅力的でない」bashのリハッシュです。

#!/ bin / bash
関数age(){
   ローカルファイル名= $ 1
   local changed = `stat -c%Y" $ filename "`
   ローカルnow = `日付+%s`
   ローカル経過

   経過=今変更
   エコー$ elapsed
}

file = "/"
echo $ fileの経過時間は$(age "$ file")秒です。

これは便利でしたが、OSXではstatの実装が異なるため、すぐには機能しませんでした。システム間で互換性のある唯一の方法は、perlを使用することでした。:あなたがこれに対応する回線交換する場合、スクリプトは、Mac上で動作するはず local changed=$(perl -MFile::stat -e "print stat(\"${filename}\")->mtime") superuser.com/questions/427551/...
ビジューTrouvaille

1
「創作時間」はわかりにくいコンセプトです。コピーしたファイルはどういう意味ですか?移動したファイルはどうなりますか?デバイスの境界を越えて移動された場合(ある意味で新しく作成された場合)はどうなりますか?パッケージ化されたファイルと後でパッケージ化されていないファイルはどういう意味ですか?ここではいくつかの回答が可能であり、コンセンサスはありません。ただし、ctimeについて言及するのは良いことですが、意味的には「作成時間」という漠然とした概念に近づけないでしょう。特にchmod、ファイルに適用された単純なはそのアイデアを無効にします。しかし、私はそれをやってあなたと一緒に暮らすことができます ;-)
Alfe

@Alfe:+%s後半から欠場しています
Grizly

その年齢はもっと短くなる可能性があります:age() { echo $(( $(date +%s) - $(date -r "$1" +%s) )); } (@Grizlyの訂正に感謝します!)
Alfe

実際には、noatimeオプションでマウントされたすべてのファイルシステムでの作成時間であるアクセス時間を使用することをお勧めします(これはパフォーマンスに優れているため、使用する必要があります)。したがって、の%X代わりに使用してください%Y
Nux

7

見つけた方がいいですが、特にファイルが何秒古いかを今すぐ確認する必要がある場合は、別の方法を使用できると思います

date -d "now - $( stat -c "%Y" $filename ) seconds" +%s

GNU日付を使用


gstatを使用し、「brew install coreutils」
Erik Johansson

3

ツール「stat」の結果を検討します。

  File: `infolog.txt'
  Size: 694         Blocks: 8          IO Block: 4096   regular file
Device: 801h/2049d  Inode: 11635578    Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1000/     fdr)   Gid: ( 1000/     fdr)
Access: 2009-01-01 22:04:15.000000000 -0800
Modify: 2009-01-01 22:05:05.000000000 -0800
Change: 2009-01-01 22:05:05.000000000 -0800

アクセス/変更/変更の3つの日付をここで確認できます。作成日はありません。ファイルの内容が変更されたとき(「変更」フィールド)またはそのiノードが変更されたとき(「変更」フィールド)は、本当に確実なだけです。

両方のフィールドが更新される例:

「変更」は、誰かがファイルの最後に追加情報を連結した場合に更新されます。

「変更」は、誰かがchmodを介して権限を変更した場合に更新されます。


確かに、statは関連情報を教えてくれます。しかし、必要なものを取得するために解析するのはかなり面倒です。
PypeBros 2017

0

私が使う

file_age() {
    local filename=$1
    echo $(( $(date +%s) - $(date -r $filename +%s) ))
}

is_stale() {
    local filename=$1
    local max_minutes=20
    [ $(file_age $filename) -gt $(( $max_minutes*60 )) ]
}

if is_stale /my/file; then
    ...
fi
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.