ファイルを最後に開いたとき


94

ファイルが最後に開かれた時間を取得し、それらの時間でディレクトリ内のすべてのファイルをソートすることは可能ですか?

回答:


172

これは、「開いた」という意味に正確に依存しますが、一般的にはそうです。通常記録されるタイムスタンプは3つあります。

  • mtime—ファイルの内容が変更されたときに更新されます。ほとんどの場合、これが「デフォルト」のファイル時間です。
  • ctime—ファイルまたはそのメタデータ(所有者、権限)が変更されたときに更新されます
  • atime —ファイルの読み取り時に更新

そのため、一般的に、見たいatimeのはファイルです。statまたはで取得できますlsls -luこれを行うために使用できますが、私は使用することを好みますがls -l --time=atime(ほとんどすべての最新のLinuxディストリビューションでサポートされるはずです)、頻繁に使用することはないため、使用するときは覚えやすくなります。そして、する並べ替えの時間によって、追加-tのlsにフラグを。それであなたは行き​​ます。

ただし、大きな警告があります。ファイルが読み込まれるたびにatimeを更新すると、通常不要なIOが大量に発生し、すべてが遅くなります。そのため、ほとんどのLinuxディストリビューションでは、デフォルトでnoatimeファイルシステムマウントオプションがデフォルトで使用されます。これは、基本的にakillを強制終了するかrelatime、制限を超えると(通常は1日に1回)更新するか、前回の読み取り以降にファイルが実際に変更された場合にのみ更新します。mountコマンドを実行すると、これらのオプションがアクティブかどうかを確認できます。

また、アクセス時間はファイル名ではなくiノードごとであるため、ハードリンクがある場合、ハードリンクから読み取ると、同じファイルを参照するすべての名前が更新されます。

また、cは「作成」ではないことに注意してください。Unix / Linuxファイルシステムでは作成が追跡されません。奇妙に思えますが、ファイルシステムがオリジナルかどうかを知る方法がないため、実際には理にかなっています。40年前にファイルが作成され、ここでコピーされた可能性があります 実際、多くのファイルエディターは、オリジナルをコピーして作成します。その情報が必要な場合は、などのバージョン管理システムを使用するのが最善gitです。


9
可能であれば、ctimeを「Creation Time」と呼ばないために、+ 1以上を提供します。
jsbillings

2
マウントのマンページによると、relatimeは1日の制限とは関係ありませんが、mtimeおよびctimeに関連するatimeのみを調べます。atimeがmtimeまたはctimeより古い場合、atimeは更新されます。atimeが両方よりも新しい場合、そのまま残されます。これの目的は、atimeとmtime / ctimeの関係を保持することです。一部のアプリケーションは、muttのようにその情報を使用して、最後に更新されてからメールボックスを読み取ったかどうかを確認します。
jw013 14年

1
@ jw013これは2.6.30カーネル以降のケースです。一部の古いディストリビューションにはこの動作がない場合があるのは事実です。(しかし、Fedoraのようなディストリビューションでは、3年前にこの回答の元のバージョンを書いたときでも真実でした。)更新されたmountマンページを探してください。
mattdm 14年

1
lsデフォルトでは、時間を合理的な精度に短縮します。時間を完全な精度で表示するには、を使用できます--full-time
jlh

19

ls -ltu すべてのファイルをリストし、アクセス時間で表示およびソートします。

からman ls

-u     with -lt: sort by, and show, access time with -l: show access
       time and sort by name otherwise: sort by access time

4

このfindコマンドはこれに最適です。参照してください-ctime-mtime-atimeのオプションを


3

リスティングが人間が消費lsするものである場合、日付ソートフラグの1つと共に使用し-tuます(アクセス(読み取り)時間、-t変更(書き込み)時間、または-tciノード変更時間のみ)。詳細については、mattdmの回答を参照してください(特に、に関する注意事項-aと定義-c)。

これがプログラムの消費用である場合、の出力の解析にls問題があります。シェルがzshの場合、lsとにかく必要はありません。zshには*(Oa)、アクセス時間()、iノード変更(*(Oc))、または変更(*(Om))時間を増やして一致をソートするグロビング修飾子があります。小文字はo年齢が上がるにつれてソートされます。

act_on_files_by_date *(Om)

それ以外の場合、ファイル名に改行または印刷不可能な文字(現在のロケール)が含まれていないことがわかっている場合は、次のようなことができます

ls -t | while read -r name; do act_on_one_file "$name"; done
ls -t | xargs -I {} act_on_one_file {}

一度に多くのファイルでコマンドを呼び出す場合は、さらにセットアップが必要です。act_on_files_by_date $(ls -t)ワイルドカード文字または空白を含むファイル名は、コマンド置換の結果として展開されるため、このように機能しないことに注意してください。次のコードは、ファイル名に改行または印刷できない文字が含まれていない限り機能します。

IFS='
'
set -f
act_on_files_by_date $(ls -t)
set +f
unset IFS

任意のファイル名に対処したい場合、標準のシェル(zsh、perl、python)よりも強力なツールに頼らずに非常に苦労します。

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