web-dev-qa-db-ja.com

日付範囲の間に作成されたファイルを検索する

ここで職場でtelnet経由でAIXを使用していますが、日付範囲内の特定のフォルダーでファイルを見つける方法を知りたいです。例:13-Aug-13〜31-Aug-13の間に作成されたフォルダX内のすべてのファイルを検索したい。

観察:

  • touchトリック(-newerオプションを使用するために2つの空のファイルを作成する)は、サーバーでのユーザーロールがファイルの作成を許可しないと機能しません。
  • 日ではなく、特定の日付の間を検索する必要があります(30日以上前に作成されたファイルなど)。
32
sanjuro8998

以下を使用して、必要なものを見つけることができます。

特定の日付/時刻より古いファイルを検索する:

find ~/ -mtime $(echo $(date +%s) - $(date +%s -d"Dec 31, 2009 23:59:59") | bc -l | awk '{print $1 / 86400}' | bc -l)

または、2つの日付の間のファイルを検索できます。最初の日付がより最近、最後の日付がより古い。 2番目に進むことができ、mtimeを使用する必要はありません。必要なものは何でも使用できます。

find . -mtime $(date +%s -d"Aug 10, 2013 23:59:59") -mtime $(date +%s -d"Aug 1, 2013 23:59:59")
7
Alex Atkinson

GNU findを使用すると、バージョン4.3.3以降で次のことができます。

find -newerct "1 Aug 2013" ! -newerct "1 Sep 2013" -ls

GNU date -d。]で受け入れられるすべての日付文字列を受け入れます。

-newerctcaBc、またはmのいずれかに変更できますatime/birth/ctime/mtime。

別の例-2017年11月6日の17:30から22:00に変更されたファイルのリスト:

find -newermt "2017-11-06 17:30:00" ! -newermt "2017-11-06 22:00:00" -ls

man findの詳細:

   -newerXY reference
          Compares the timestamp of the current file with reference.  The reference argument is normally the name of a file (and one of its timestamps  is  used
          for  the  comparison)  but  it may also be a string describing an absolute time.  X and Y are placeholders for other letters, and these letters select
          which time belonging to how reference is used for the comparison.

          a   The access time of the file reference
          B   The birth time of the file reference
          c   The inode status change time of reference
          m   The modification time of the file reference
          t   reference is interpreted directly as a time

          Some combinations are invalid; for example, it is invalid for X to be t.  Some combinations are not implemented on all systems; for example B  is  not
          supported on all systems.  If an invalid or unsupported combination of XY is specified, a fatal error results.  Time specifications are interpreted as
          for the argument to the -d option of GNU date.  If you try to use the birth time of a reference file, and the birth time cannot be determined, a fatal
          error  message  results.   If  you  specify a test which refers to the birth time of files being examined, this test will fail for any files where the
          birth time is unknown.
97
codebeard

これを試して:

find /var/tmp -mtime +2 -a -mtime -8 -ls

2日以上8日以上経過していないファイルを検索します。

40
frank42

ここでいくつかの良い解決策。短いだけでなく、私のものを共有したかった。

Find(GNU findutils)4.5.11を使用しています

$ find search/path/ -newermt 20130801 \! -newermt 20130831
12
Jason Slobotski

statを使用して作成時間を取得します。 YYYY-MM-DD HH:MM:SS形式の時間を辞書順に比較できます。

これはLinuxでの変更時間で機能し、作成時間はサポートされていません。 AIXでは、-cオプションはサポートされていない可能性がありますが、何も機能しない場合はgrepを使用して、とにかく情報を取得できるはずです。

#! /bin/bash
from='2013-08-01 00:00:00.0000000000' # 01-Aug-13
to='2013-08-31 23:59:59.9999999999'   # 31-Aug-13

for file in * ; do
    modified=$( stat -c%y "$file" )
    if [[ $from < $modified && $modified < $to ]] ; then
        echo "$file"
    fi
done
5
choroba

スクリプトoldfiles

この質問にもっと完全な方法で答えようとしましたが、findコマンドの理解に役立つオプションを備えた完全なスクリプトを作成することになりました。

スクリプトoldfilesはこの中にあります リポジトリ

新しいfindコマンドを「作成」するには、オプション_-n_(dry-run)を指定して実行します。使用する必要がある正しいfindコマンドが出力されます。

もちろん、_-n_を省略すると、単に実行されるだけなので、findコマンドを再入力する必要はありません。

使用法:

$ oldfiles [-v...] ([-h|-V|-n] | {[(-a|-u) | (-m|-t) | -c] (-i | -d | -o| -y | -g) N (-\> | -\< | -\=) [-p "pat"]})

  • オプションが次のグループに分類される場合:
    • ヘルプと情報:

      -h、--help:このヘルプを表示します。
      -V、--version:バージョンを表示します。
      -v、--verbose:詳細モードをオンにします(累積)。
      -n、--dry-run:実行せず、「find」コマンドの作成方法を説明するだけです

    • 時間タイプ(アクセス/使用、変更時間、または変更されたステータス):

      -aまたは-u:アクセス(使用)時間
      -mまたは-t:変更時刻(デフォルト)
      -c:iノードのステータスの変更

    • 時間範囲(Nは正の整数):

      -i N:分(デフォルト、Nは1分)
      -d N:日
      -o N:月
      -y N:年
      -g N:Nは日付(例:「2017-07-06 22:17:15」)

    • テスト:

      -p "pat":一致するオプションのパターン(例:cファイルを見つけるための-p "* .c")(デフォルト-p "*")
      -\>:ファイルは指定された範囲よりも新しい、つまり、それ以降に変更された時間.
      -\ <:ファイルは指定された範囲よりも古い、つまり、時間はその前からです。 (デフォルト)
      -\ =:正確にN(分、日、月、年)古くなったファイル。

例:

  • 10分(アクセス時間)より新しいCソースファイルを検索します(詳細度3):

$ oldfiles -a -i 10 -p"*.c" -\> -nvvv Starting oldfiles script, by beco, version 20170706.202054... $ oldfiles -vvv -a -i 10 -p "*.c" -\> -n Looking for "*.c" files with (a)ccess time newer than 10 minute(s) find . -name "*.c" -type f -amin -10 -exec ls -ltu --time-style=long-iso {} + Dry-run

  • 1か月(変更時間)より古いHヘッダーファイルを検索します(詳細度2):

_$ oldfiles -m -o 1 -p"*.h" -\< -nvv Starting oldfiles script, by beco, version 20170706.202054... $ oldfiles -vv -m -o 1 -p "*.h" -\< -n find . -name "*.h" -type f -mtime +30 -exec ls -lt --time-style=long-iso {} + Dry-run_

  • 1日以内にすべての(*)ファイルを検索します(2016年12月1日、冗長性なし、ドライラン):

_$ oldfiles -mng "2016-12-01" -\= find . -name "*" -type f -newermt "2016-11-30 23:59:59" ! -newermt "2016-12-01 23:59:59" -exec ls -lt --time-style=long-iso {} +_

もちろん、_-n_を削除すると、プログラムはfindコマンド自体を実行し、トラブルを軽減します。

これがみんなが最終的にこの_{a,c,t}{time,min}_オプションを学ぶのに役立つことを願っています。

lS出力:

また、「ls」オプション_ls OPT_は、選択した時間のタイプに合わせて変更されることにも気付くでしょう。

oldfilesスクリプトのクローン/ダウンロードのリンク:

https://github.com/drbeco/oldfiles

2
Dr Beco