find 式 (atime = ctime) (アクセス時間 = 変更時間) をどのように記述しますか?

find 式 (atime = ctime) (アクセス時間 = 変更時間) をどのように記述しますか?

最後の inode 変更以降にアクセスされていないファイルのセットを見つけて削除します。ファイルが現在あるディレクトリに移動されたときに最後のアクティビティが発生したファイルです。

ここでは、各ファイルをfind test -newerの参照ファイルとして渡そうとしています。

man find 
...
-newerXY reference
          Compares  the timestamp of the current file with reference.   
...    

これは私がこれまで試したことですが、うまくいきませんでした。

find . -type f | xargs -I{} find -newerac {} -printf "%p\tinode: %i\naccess: \t%a\nchange: \t%c\n"

答え1

これにより、atime と ctime の間で異なるすべてのファイルが表示されます。

find . -type f -printf "%p\n%a\n%c\n\n" | \
  awk 'BEGIN {FS="\n"; RS=""}; $2!=$3 {print $1}'

次の例をご覧ください:

ls -1
data
data1
ss.08-02-2012-01.22.16-PM.png
ss.09-02-2012-13.42.06-PM.png
test.awk
test.py
test.sh

次に、ファイルの統計情報を見てみましょう。

find . -type f -printf "%p\n%a\n%c\n\n"
./test.sh
Tue Aug 21 15:12:29.0000000000 2012
Tue Aug 21 15:12:29.0000000000 2012

./data1
Tue Aug 21 15:13:13.0000000000 2012
Tue Aug 21 15:12:29.0000000000 2012

./test.awk
Tue Aug 21 15:12:29.0000000000 2012
Tue Aug 21 15:12:29.0000000000 2012

./data
Tue Aug 21 15:12:29.0000000000 2012
Tue Aug 21 15:12:29.0000000000 2012

./test.py
Tue Aug 21 15:12:29.0000000000 2012
Tue Aug 21 15:12:29.0000000000 2012

./ss.09-02-2012-13.42.06-PM.png
Tue Aug 21 15:12:29.0000000000 2012
Tue Aug 21 15:12:29.0000000000 2012

./ss.08-02-2012-01.22.16-PM.png
Tue Aug 21 15:12:29.0000000000 2012
Tue Aug 21 15:12:29.0000000000 2012

awk による後続処理を容易にするために、各フィールドを改行で、各レコードを空白行で区切ります。awk 'BEGIN {FS="\n"; RS=""}; $2!=$3 {print $1}'
ここでは、フィールド区切り文字とレコード区切り文字が先頭に設定されています (RS は空の文字列を空白行として解釈します)。つまり、$2 と $3 には atime と ctime が保持されます。これらが異なる場合は、対応するファイル名 ($1 内) が印刷されます。

結果は次のとおりです。

./data1

関連情報