はじめに

findコマンドを使用して、指定された日付よりに更新されたファイルを抽出したいということがあったので実践する。

環境

1
2
MacOS Ventura
zsh 5.9

コマンド

早速だが、下記のコマンドで実現できる。

1
find . -type f -newermt "2023-09-15 00:00:00"
1
2
3
4
5
6
find .
でカレントディレクトリを探し、
-type f 
で ファイルのみを検索する
-newermt "2023-09-15 00:00:00"
では、 -newermtより後に指定した日付より後に更新されたものを検索する

これだと、ファイルのみ一覧として取れるので、 -ls をつけてあげるとわかりやすく更新日時も見える。

検証

では検証してみる。
下記でテスト用のディレクトリとテスト用のファイルを作成した。

1
2
mkdir -p workspace/test && cd $_
touch testfile

下記でできているはず

1
2
3
4
5
6
7
~/workspace/test$ls -al
ls -al
total 0
drwxr-xr-x 3 user staff  96  9 15 21:53 .
drwxr-xr-x 5 user staff 160  9 15 21:51 ..
-rw-r--r-- 1 user staff   0  9 15 21:53 testfile
~/workspace/test$

ではこのディレクトリにいるままで、さっきのコマンドを実行する。

1
find . -type f -newermt "2023-09-15 00:00:00" -ls
1
2
3
4
~/workspace/test$find . -type f -newermt "2023-09-15 00:00:00" -ls
find . -type f -newermt "2023-09-15 00:00:00" -ls
50833360        0 -rw-r--r--    1 user     staff                   0  9 15 21:53 ./testfile
~/workspace/test$

ok ちゃんと取れている
さて、ここで疑問なのは本当にこの日付より後のものをとってきているのかが気になる。
というわけで、さらにテストファイルを作成し、更新日時を変えてみる。

1
2
3
touch -d "2023-09-01 00:00:00" beforefile
touch -d "2023-09-15 00:00:00" justfile
touch -d "2023-09-16 00:00:00" afterfile
1
2
3
4
5
6
7
8
9
~/workspace/test$ls -al
ls -al
total 0
drwxr-xr-x 6 user staff 192  9 15 21:58 .
drwxr-xr-x 5 user staff 160  9 15 21:51 ..
-rw-r--r-- 1 user staff   0  9 16  2023 afterfile
-rw-r--r-- 1 user staff   0  9  1 00:00 beforefile
-rw-r--r-- 1 user staff   0  9 15 00:00 justfile
-rw-r--r-- 1 user staff   0  9 15 21:53 testfile

テストファイルも期待した通りにできた。

さて、これで再度同じコマンドを実行してみる。

1
find . -type f -newermt "2023-09-15 00:00:00" -ls
1
2
3
4
5
~/workspace/test$find . -type f -newermt "2023-09-15 00:00:00" -ls
find . -type f -newermt "2023-09-15 00:00:00" -ls
50870142        0 -rw-r--r--    1 user     staff                   0  9 16 00:00 ./afterfile
50833360        0 -rw-r--r--    1 user     staff                   0  9 15 21:53 ./testfile
~/workspace/test$

okできている。

余談

余談ではあるが、 -newermt ではなく、 -mtime, -mmin を使うと、今度は何日前、何分前というような指定が可能になる。

おまけ

抽出したファイルを tarコマンドで圧縮したいというとき。

1
find . -type f -newermt "2023-09-15 00:00:00" -print0 | tar -czvf output.tar.gz --null -T -
1
2
3
4
5
~/workspace/test$find . -type f -newermt "2023-09-15 00:00:00" -print0 | tar -czvf output.tar.gz --null -T -
find . -type f -newermt "2023-09-15 00:00:00" -print0 | tar -czvf output.tar.gz --null -T -
a ./afterfile
a ./testfile
~/workspace/test$ls

ちゃんと指定したファイルが圧縮されている。

ちなみにこれはChatGPTに教えてもらった。 以下は回答をもらった時の入力と出力

入力: find で検索した結果をtar.gz形式で圧縮したいです。日本語やスペース、特殊文字にも対応できるようなコマンドをお願いします

出力: findコマンドで検索した結果をtar.gz形式で圧縮するために、日本語やスペース、特殊文字に対応したコマンドを以下に示します。

1
find /path/to/search -type f -print0 | tar -czvf output.tar.gz --null -T -

このコマンドは以下の要素から構成されています:

  1. /path/to/search: 検索を行いたいディレクトリのパスを指定してください。
  2. -type f: ファイルのみを対象とするオプションです。
  3. -print0: findコマンドの結果をヌル文字 (\0) で区切って出力するオプションです。これにより、ファイル名にスペースや特殊文字が含まれていても正しく処理されます。
  4. tar -czvf output.tar.gz: tarコマンドを使用してファイルを圧縮し、output.tar.gzという名前のアーカイブファイルを作成します。
  5. --null: ヌル文字 (\0) で区切られたファイル名を受け付けるようにtarコマンドに指示します。
  6. -T -: findコマンドの出力をtarコマンドに渡します。-T -は標準入力からファイル名を読み取ることを意味します。

このコマンドを実行すると、findで検索したファイルがoutput.tar.gzに圧縮されます。日本語、スペース、特殊文字が含まれているファイル名でも問題ありません。

参考

おわりに

findコマンドはサーバ作業をしてよく使うので、特にこういった細かい作業をする際にはぜひ覚えておきたい。
とはいえ、ChatGPTが出てからはやりたいことを書くだけでコマンドを教えてくれるので本当に助かる。