findがファイルを解釈する理由に頭を悩ませるのに苦労しています具体的には、-mtime +1が48時間未満のファイルを表示しない理由がわかりません。

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

[[email protected] 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を実行しました。次の出力:

[[email protected] findtest]# find -mtime +1 ./foo3 

次に、-mmin +1440でfindを実行すると、次の出力が得られました:

[[email protected] 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日経過していないため、無視されますか?

計算しません…計算しません…。

コメント

  • 最初は私も面白そうに見えましたが、ファイルの経過時間を整数日で測定すると考えると、正確に測定されます。 'が期待すること。 ' 1日経過したファイルは提供されません。 int(1.99)日経過したファイルは、> 1ではありません。
  • 人間が口語的に年齢をどのように扱うかを考えてください。誰かが79.9歳である場合、あなたは彼らが79歳であると言います。したがって、79歳以上の人間を探している場合は、> 79.99999歳、つまり>の人間を探しています。 = 80歳。人々は年齢を整数と見なし、それを切り捨てて、各年齢を範囲と見なします。

回答

まあ、簡単な答えは、おそらく、findの実装はPOSIX / SuS標準に準拠していることです。これは、このように動作する必要があることを示しています。 SUSv4 / IEEE Std 1003.1、2013 Edition、 “find” からの引用:

-mtime n
初期化時間から差し引かれた
ファイル変更時間を86400で割った値(余りは破棄されます)がnの場合、プライマリはtrueと評価されます。

(そのドキュメントの他の場所では、nは実際には+nである可能性があり、その意味は「より大きい」)。

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

指定された動作も移植可能です。 (時刻ではなく)変更日のみを保存した架空のシステムに。そのようなシステムが存在したかどうかはわかりません。

コメント

  • findは、クリーンアップジョブのみを実行するように明確に設計されています。

回答

-mtimeの引数は、

ファイルの経過時間の1日。-mtime +nは厳密により大きい場合、-mtime -n厳密に未満。

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

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

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

(解決が必要な場合は、-mtimeに小数の引数を入力するよりも簡単です。時間または分。)

コメント

  • 人間が読めるサイズでchrでこれらのファイル(通常のみ)を一覧表示するにはonological order、do $ find . -type f -mmin -$((60*24)) -exec ls -halt {} +
  • これは、24時間前に、これらのコマンドの両方が1分間のウィンドウ内のファイルを見逃してしまうという点でも同じ効果があります。 。
  • $(())はプレーンシェル算術構文であり、'はBashに固有のものではありません。 pubs.opengroup.org/onlinepubs/009695399/utilities/ …
  • @JosipRodin No 、必ずしも真実ではありません! This chapter describes the syntax of that command language as it is used by the sh utility and [...]。 Bashは"拡張" SHであるため、この構文をサポートしていますが、他の一部のシェルはサポートしていません' t、例: csh / tcsh。
  • @ t0r0X私のポイントは、'はバシズムではなく、ダッシュとzshで機能し、その他は従来の機能として機能するということでした。 /bin/sh

回答

分数の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 

コメント

  • ありがとう、-mtimeXが-mtimeと異なる理由を理解しようとしていました+ X
  • + Xは(X + 1、X + 2、X + 3、…)の短縮形を意味すると思います。 🙂
  • すべてのソースドキュメントへのリンクは、単純な答えを混乱させます。例は重要です。その優れたドキュメント。それらをもっとやってみましょう!私はこの回答が好きです

回答

-mtime Nはファイルを意味します日数での年齢 A N A < N +を満たします1.1。つまり、-mtime Nは、+ 1日前に N から N の間に最後に変更されたファイルを選択します。

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

たとえば、-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つの段落findのドキュメントに追加する必要があります!

回答

したがって、ファイルが1日、23時間、59分、59秒前の場合、find -mtime +1はそれをすべて無視し、1日として扱います。 、0時間、0分、0秒前ですか?

はい。man findのように「 「1日23時間59分59秒」を「24時間」で割ると1.9999になりますが、tその後、.9999の部分が削除され、突然ファイルが1日しか経過しなくなります。

回答

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

コメント

  • -?min引数は

引数(日ではなく分を除く)。 'どちらも「正確」ではありません。

回答

2日ではなく正確に48時間前のファイルが必要な場合は、findコマンドに--daystartを追加する必要があります。これは役に立ちます。

find . type -f -daystart -mtime +1 

コメント

  • いいえ、最初に' s -daystart(GNU拡張機能)、--daystartではありません。次に、-daystartは、現在の時刻ではなく今日の開始時刻と時刻を比較することを意味するため、--daystart -mtime +1はさらに変更されたファイルを報告します今日の始まりの48時間/ 2時間前なので、通常、昨日の前日に大幅に変更されたファイル。