Bashを使用すると、読んだことがない(または変更された時間が読んだのと同じ)ファイルのリストを取得できますか?

Bashを使用すると、読んだことがない(または変更された時間が読んだのと同じ)ファイルのリストを取得できますか?

たとえば、フォルダがある場合、そのフォルダとそのサブフォルダにある一度も読んだことのないすべてのファイルのリストを取得できますか?

しかし、これは可能ですか? (実際にファイルが作成されると、「最後のアクセス時間」が更新されるためです)。この場合、最後のアクセス時間が最後の変更時間と同じすべてのファイルのリストを取得することも可能です。

答え1

次のperlスクリプトは、atime <= mtimeのすべてのファイル(つまり、最後の書き込み以降に未読ファイル)を検索し、フルパスを印刷します。

$ perl -MFile::Find=find -e 'find {
   wanted => sub {my @s=stat; print "$_\n" if $s[8]<=$s[9]},
   no_chdir => 1
}, @ARGV' files and dirs ...

または、GNU findの移植不能な機能を使用してください。

$ find [files and dirs ...] -printf '%A@ %T@  %p\n' |
  awk '$1 <= $2 { print substr($0, index($0, "  ")+2) }'

このfindバージョンは、atimeとmtimeの間の1秒未満の違いも処理するため、より正確です。改行文字を含むファイル名は処理されません。これは;と一緒に-printf '...\0'GNU awk(gawk)を使用してRS="\0"解決できます。ただし、挿入された改行文字が明確に表示される出力形式を決定する必要があります。

これらのどれでもこれを行うことができますbash。これを行うことは純粋にbash読者に練習として残されます。 ;-)

ファイルタイムスタンプに関する注意:

これはすべてファイルシステムですMS_NOATIME

atime は、ファイルを開いたり書き込んだときには更新されず、読み込み (2)、pread(2)、execve(2) などで何らかの方法で読み取った場合にのみ更新されます。

また、Unixには「生成時間」はありません。 ctime は状態の時間です。変化メタデータが変更されるか、ファイルが書き込まれるたびに更新されます。

最新の Linux カーネル (>4.11) は、以下で確認できるファイル作成/生成時間も知っています。統計(2)相互作用。ただし、これは非標準であり、まだほとんどのディストリビューションではサポートされていません。

関連情報