find -mtime +1が2日以上経過したファイルのみを返すのはなぜですか?


117

私は周りの私の心を包むのに苦労してる理由find解釈はそれがない方法変更時刻をファイル。具体的には、-mtime +148時間未満のファイルが表示されない理由がわかりません。

テストの例として、変更日が異なる3つのテストファイルを作成しました。

[root@foobox findtest]# ls -l
total 0
-rw-r--r-- 1 root root 0 Sep 25 08:44 foo1
-rw-r--r-- 1 root root 0 Sep 24 08:14 foo2
-rw-r--r-- 1 root root 0 Sep 23 08:14 foo3

次に、-mtime +1スイッチでfindを実行し、次の出力を得ました。

[root@foobox findtest]# find -mtime +1
./foo3

次に、findを実行して-mmin +1440、次の出力を得ました。

[root@foobox findtest]# find -mmin +1440
./foo3
./foo2

findのmanページによると、これは予想される動作であることを理解しています。

 -mtime n
        File’s  data was last modified n*24 hours ago.  See the comments
        for -atime to understand how rounding affects the interpretation
        of file modification times.


-atime n
       File  was  last  accessed n*24 hours ago.  When find figures out
       how many 24-hour periods ago the file  was  last  accessed,  any
       fractional part is ignored, so to match -atime +1, a file has to
       have been accessed at least two days ago.

これはまだ私には意味がありません。ファイルが1日、23時間、59分、59秒find -mtime +1経過している場合、それをすべて無視し、1日、0時間、0分、0秒経過したものとして処理しますか?どちらの場合、その1日は技術的に古くなく、無視されますか?

計算しません...計算しません。


7
最初はそれもおもしろそうに見えましたが、整数日単位でファイルの経過時間を測定すると考えると、期待どおりに動作します。1日前のファイルは提供されません。INT(1.99)日古いファイルが> 1ではありません
タコ

回答:


87

簡単な答えは、findの実装はPOSIX / SuS標準に従っているということです。SUSv4 / IEEE Std 1003.1、2013 Edition、「find」からの引用:

-mtime n      初期化時間から
     ファイル修正時間を引いた値
を86400で割った値(余りは切り捨てる)がnの場合、プライマリはtrueと評価されます。

(その文書の別の場所では、n実際に+nである可能性があると説明されており、その意味は「より大きい」)。

標準がそのように振る舞うと言っている理由については、まあ、プログラマーは怠けているか、それについて考えていなかったので、Cコードを書いただけだったと思います(current_time - file_time) / 86400。C整数演算は、剰余を破棄します。スクリプトはその動作に応じて開始されたため、標準化されました。

仕様の動作は、(日付ではなく)変更日のみを保存した仮想システムにも移植可能です。そのようなシステムが存在したかどうかはわかりません。


3
findは、クリーンアップジョブのみを行うように設計されています。
ドゥイツFlarup

84

への引数は、ファイルの経過時間-mtime全日数として解釈されます。-mtime +n意味よりも厳密に大きい-mtime -n意味厳密未満。

Bashを使用すると、より直感的な操作ができることに注意してください。

$ find . -mmin +$((60*24))
$ find . -mmin -$((60*24))

それぞれ24時間より古いファイルと新しいファイルを検索します。

-mtime数時間または数分で解決したい場合は、分数引数を入力するよりも簡単です。)


2
これらのファイル(通常のみ)を人が読めるサイズで時系列順にリストするには、次のようにします$ find . -type f -mmin -$((60*24)) -exec ls -halt {} +
Evgeni Sergeev 14

1
また、これらのコマンドの両方が24時間前の1分間のウィンドウ内のファイルを見逃すという点でも同じ効果があります。
タコ14

1
$(())は単純なシェル算術構文であり、Bashに固有のものではありません。pubs.opengroup.org/onlinepubs/009695399/utilities/...
ヨシップ・ロダン

@JosipRodinいいえ、必ずしも真実ではありません!This chapter describes the syntax of that command language as it is used by the sh utility and [...]。Bashは「拡張」SHであるため、この構文をサポートしていますが、csh / tcshなどの他のシェルはサポートしていません。
t0r0X

@ t0r0X私のポイントは、それがバシズムではなく、むしろダッシュとzshで動作し、他のものは従来のものとして機能するということ/bin/shでした。
ジョシップロダン

45

24時間単位の端数は切り捨てられます!つまり、「find -mtime +1」は、2日以上前に変更されたファイルと一致することを意味します。

find . -mtime +0 # find files modified greater than 24 hours ago
find . -mtime 0 # find files modified between now and 1 day ago
# (i.e., in the past 24 hours only)
find . -mtime -1 # find files modified less than 1 day ago (SAME AS -mtime 0)
find . -mtime 1 # find files modified between 24 and 48 hours ago
find . -mtime +1 # find files modified more than 48 hours ago

以下はGNUでのみ動作しますか?

find . -mmin +5 -mmin -10 # find files modified between
# 6 and 9 minutes ago
find / -mmin -10 # modified less than 10 minutes ago

おかげで、私は-mtime Xが+ X -mtimeよりも異なっていた理由を把握しようとしていた
Vnge

+ Xは(X + 1、X + 2、X + 3、...)のショートを意味すると思います。:)
エリック

18

ファイルが1日、23時間、59分、59秒経過している場合、find -mtime +1はそれをすべて無視し、1日、0時間、0分、0秒経過したものとして処理しますか?

はい。同様にman find、「任意の小数部分が無視される」、と言います。「1日、23時間、59分、59秒」を「24時間」で割ると、1.9999になりますが、.9999の部分が削除され、突然ファイルが1日前になります。


18

-mtime Nその年齢のファイルを意味A日間で満たすNA < N +1を。言い換えれば、間を最後に変更されたファイルを選択NN 1日前に。-mtime N

-mtime -N年齢AA < Nを満たすファイル、つまりN日前に変更されたファイルを意味します。あまり直感的に、その年齢のファイルを意味Aを満たすN 1≤ A、つまりファイルが少なくとも修正N 1日前に。-mtime +N

たとえば-mtime 1、1〜2日前に変更されたファイルを選択します。-mtime +1少なくとも2日前に変更されたファイルを選択します。少なくとも1日前にファイルを変更するには、を使用します-mtime +0

「最後に修正されたのはn * 24時間前でした」という説明はあくまでも概算であり、あまり明確ではありません。

これらのルールを覚えにくい場合は、代わりに参照ファイルを使用してください。

touch -d '1 day ago' cutoff
find . -newer cutoff

(構文「1日前」にはGNUが必要touchです。)


3
いい説明です。最初の3つの段落をfind!のドキュメントに追加する必要があります。
メレビウス

4

-mmin、-aminなどを使用して正確な結果を取得します


6
-?min引数は、正確に同じように動作し-?timeなく数分の日を除いて引数。どちらも「正確」ではありません。
ジル

-2

2日ではなく正確に48時間前のファイルが必要な場合は--daystartfindコマンドを追加する必要があります。これはあなたを助けます。

find . type -f -daystart -mtime +1

5
いいえ、最初は-daystart(GNU拡張)であり、ではありません--daystart。次に、-daystart現在の時刻ではなく、今日の始まりと時刻を比較することを意味するため、今日の始まりの--daystart -mtime +148時間/ 2時間以上前に修正されたファイルを報告します。 。
ステファンシャゼル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.