web-dev-qa-db-ja.com

特定の年に作成されたディレクトリ内のファイルの数を検索します

2016年に作成されたディレクトリとそのサブディレクトリ内のファイルの数を(再帰的に)取得したいと思います。「。txt」など、特定のファイルで終わるファイルのみを気にします。ターミナルでこれを実現するにはどうすればよいですか?

4
lijas

GNU find

find /some/dir -type f -name '*.txt' -printf '%CY\n' | grep -Fxc 2016

これにより、ローカルタイムゾーンで2016年にctimeのファイルがカウントされます。 ctimeはファイルの作成時間ではありませんが、標準のUNIXセマンティクスで期待できる最適な近似時間であることに注意してください。

変更時刻を一致させたい場合は、-printf '%TY\n'の代わりに上記の-printf '%CY\n'を使用できます。

4
Satō Katsura

これは、GNUfindを必要としないポータブルな方法です。

まず、タイムスタンプを含むファイルを作成します

touch -t 201601010000 /tmp/2016 && touch -t 201701010000 /tmp/2017

次に実行します。

find /some/path -type f -name '*.txt'  -newer /tmp/2016 ! -newer /tmp/2017
4

GNU findで、ファイルをサポートするシステムおよびファイルシステムで誕生時間

find . -name '*.txt' -type f -newerBt 2016-01-01 \
                           ! -newerBt 2017-01-01 -printf . | wc -c

技術的には、2016-01-01 00:00:00.000000000ナノ秒で作成されたファイルを除外し、2017年にそのナノ秒で作成されたファイルを含めます(あなたの時計がその精度を持っているとは思わない、またはとにかく重要であるとは思わないが、可能性があるたとえば、00:00:00にcronジョブによって作成されたファイルの1秒未満のタイムスタンプをサポートしないファイルシステムに関する問題)

システムが誕生時刻をサポートしていない場合は、最終変更時刻に戻すことができます(これは、ファイルがインスタンス化された時刻であり、ファイル内のデータがインスタンス化された時刻ではないため、とにかく良いでしょう)。 newerBtnewermtに変更することにより、実際にはほとんど関連性がありません。

BSD find(ここでそれらの-newerxy from)、次のように変更できます:

find .//. -name '*.txt' -type f -newerBt 2016-01-01 \
                              ! -newerBt 2017-01-01 | grep -c //
4