はじめに
find
コマンドを使用して、指定された日付よりに更新されたファイルを抽出したいということがあったので実践する。
環境
MacOS Ventura
zsh 5.9
コマンド
早速だが、下記のコマンドで実現できる。
find . -type f -newermt "2023-09-15 00:00:00"
find .
でカレントディレクトリを探し、
-type f
で ファイルのみを検索する
-newermt "2023-09-15 00:00:00"
では、 -newermtより後に指定した日付より後に更新されたものを検索する
これだと、ファイルのみ一覧として取れるので、 -ls
をつけてあげるとわかりやすく更新日時も見える。
検証
では検証してみる。
下記でテスト用のディレクトリとテスト用のファイルを作成した。
mkdir -p workspace/test && cd $_
touch testfile
下記でできているはず
~/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$
ではこのディレクトリにいるままで、さっきのコマンドを実行する。
find . -type f -newermt "2023-09-15 00:00:00" -ls
~/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 ちゃんと取れている
さて、ここで疑問なのは本当にこの日付より後のものをとってきているのかが気になる。
というわけで、さらにテストファイルを作成し、更新日時を変えてみる。
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
~/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
テストファイルも期待した通りにできた。
さて、これで再度同じコマンドを実行してみる。
find . -type f -newermt "2023-09-15 00:00:00" -ls
~/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コマンドで圧縮したいというとき。
find . -type f -newermt "2023-09-15 00:00:00" -print0 | tar -czvf output.tar.gz --null -T -
~/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
形式で圧縮するために、日本語やスペース、特殊文字に対応したコマンドを以下に示します。
find /path/to/search -type f -print0 | tar -czvf output.tar.gz --null -T -
このコマンドは以下の要素から構成されています:
/path/to/search
: 検索を行いたいディレクトリのパスを指定してください。-type f
: ファイルのみを対象とするオプションです。-print0
:find
コマンドの結果をヌル文字 (\0
) で区切って出力するオプションです。これにより、ファイル名にスペースや特殊文字が含まれていても正しく処理されます。tar -czvf output.tar.gz
:tar
コマンドを使用してファイルを圧縮し、output.tar.gz
という名前のアーカイブファイルを作成します。--null
: ヌル文字 (\0
) で区切られたファイル名を受け付けるようにtar
コマンドに指示します。-T -
:find
コマンドの出力をtar
コマンドに渡します。-T -
は標準入力からファイル名を読み取ることを意味します。
このコマンドを実行すると、find
で検索したファイルがoutput.tar.gz
に圧縮されます。日本語、スペース、特殊文字が含まれているファイル名でも問題ありません。
参考
- FIND | Man page of FIND
https://linuxjm.osdn.jp/html/GNU_findutils/man1/find.1.html - 【 touch 】コマンド――タイムスタンプを変更する/新規ファイルを作成する
https://atmarkit.itmedia.co.jp/ait/articles/1606/14/news013.html
おわりに
find
コマンドはサーバ作業をしてよく使うので、特にこういった細かい作業をする際にはぜひ覚えておきたい。
とはいえ、ChatGPTが出てからはやりたいことを書くだけでコマンドを教えてくれるので本当に助かる。