今回も前回に続きUNIX系OSのfindコマンドを使ってテキストファイルを検索しますが、より細かく条件を指定して検索してみます。今回もいつものようにサンプルファイルはデスクトップのsampleディレクトリに入れておきます。また、カレントディレクトリをこのsampleディレクトリとします。コマンドならcd ~/Desktop/sampleです。
find検索その前に
以後の説明でfindコマンドで日付や時間を指定して検索しますが、実際にやってみようとすると困ってしまう人もいるかもしれません。例えば一週間前に変更されたファイルを検索するような場合、そんなに都合よく一週間前のファイルが存在するとは限りません。
何でもご都合主義で進めてしまうのもありですが、それだと実際にコマンドを入力して確認することが難しくなってしまいます。そこで、まずは日付を変更するコマンドを使ってみましょう。と言っても、これまで何回か出てきたtouchコマンドを使うだけです。
touchコマンドの後に日付(最終更新日)を変更したいファイル名(ファイルパス)を指定します。実行するとtouchコマンドを実行した時点での最終更新日に変更されます。
ls -laとした場合、macOSではより詳細な更新日は表示されません。この場合はTオプションを指定します。
実際には指定したファイルを最終更新日にしたい事は少ないでしょう。指定した日時に変更する場合はtオプションを指定し、その直後に年月日を指定します。形式はMMDDhhmm、YYMMDDhhmm、YYYYMMDDhhmm、YYYYMMDDhhmm.SSなどで指定します。
YY:西暦下2桁
YYYY:西暦4桁
MM:月
DD:日にち
hh:2桁の時間(24時間制)
mm:2桁の分
SS:2桁の秒
ちなみに日付指定を間違えると以下のようなメッセージが表示されます。
touch: out of range or illegal time specification: [[CC]YY]MMDDhhmm[.SS]
カレントディレクトリにあるsample.txtの最終更新日を2020年11月3日23時59分にするには以下のように指定します。
touch -t 202011032359 sample.txt
ちなみにまとめてファイルの最終更新日を変更することもできます。以下のようにするとカレントディレクトリにある拡張子がtxtのファイルの最終更新日がtouchコマンドを実行した時点の日付になります。
touch *.txt
dateコマンドとの組み合わせ
特定のファイルをtouchコマンド実行時より3日前の最終更新日にしたい場合、現在の日付から計算してコマンド列に入力するのは面倒です。というより、こういう計算こそコンピューターの出番のはずです。
という事で、今度は日付を求めることができるdateコマンドと組み合わせてみましょう。dateコマンドは以前にもやりました。(第4回参照)
dateコマンドは、そのまま入力すると現在の日時を表示します。
date
ここで前日の日付を表示するにはdateオプションを使い'1 days ago'のように指定します。--dateのロングオプションではなく-dとしても同じです。
date --date '1 days ago'
1の数字を2にすると2日前になります。7なら1週間前になります。数字を変更すれば自由な日付を表示することができます。
date --date '2 days ago'
date --date '7 days ago'
ただし、macOSなどBSD系では上記のように指定するとエラーになってしまいます。
これは指定するオプションとパラメーターが異なるためです。macOS/BSD系ではvオプションを指定し、その直後に-1dのように表示する日付のオフセットを指定します。
date -v -1d
-2dとすると二日目になります。また、-v-2dのように半角空白は入れなくても動作します。
date -v-2d
date -v -7d
これで現在の日付から●日前の日付を表示することができましたが、touchコマンドで指定できる形式にあわせなければいけません。
日付を指定した形式で出力するには%Y%m%dのフォーマット文字列を指定します。ここらへんは以前の第4、5回目の連載(第4回目、第5回目)で説明しているので、そちらを参照してください。
年月日をyyyymmdd0000で表示するにはオプションパラメーターで'+%Y%m%d0000'と指定します。これはLinuxでもmacOSでも同じですが、macOSの場合は先にvオプションを指定してから出ないとエラーになります。以下のように指定すれば前日の0時0分を示すフォーマットされた文字列が表示されます。
・Linux
date '+%Y%m%d0000' --date '1 days ago'
・macOS
date -v -1d '+%Y%m%d0000'
これでtouchコマンドに渡す文字列が生成できました。あとは生成された日付を`(バッククォート)で囲めばtouchコマンドのパラメーターとして指定することができます。
・Linux
touch -t `date '+%Y%m%d0000' --date '1 days ago'` sample.txt
・macOS
touch -t `date -v -1d '+%Y%m%d0000'` sample.txt
指定した日にちの範囲内に変更されたファイルの検索
まず、一定期間内に変更したされたファイルを検索してみましょう。なお、検索するファイルの日付は以下のようになっています。これらのファイルは先ほど説明したtouchコマンドを使って生成しています。
実行画面とコマンドはmacOSのものですが、Linux系の場合はls -lTは、そのままls -lで読み替えてください。なお、以後のfindコマンドはLinuxでもmacOSでも同じです。
findコマンドは高機能なので様々なオプションがあります。変更日を指定する場合は-mtimeを使います。-mtimeの後に日数を指定します。この日数ですが、符号なしの0を指定すると当日(実行時から24時間以内)になります。つまり以下のようにするとカレントディレクトリ以下で今日変更されたファイルがリストアップされます。
find . -type f -mtime 0
ここで0に+記号をつけると動作が変わります。+だと当日直前(当日未満)までのファイルがリストアップされます。
find . -type f -mtime +0
前日(24時間〜48時間前)に変更されたファイルの場合は+-などの記号を付けない数字の1だけを指定します。2を指定すれば一昨日変更されたファイルがリストアップされます。
find . -type f -mtime 1
find . -type f -mtime 2
ただ、ここで注意しないといけないのは前日(1日前)というのは一般的な深夜0時を基準にしたものではなくコマンド実行時から24時間前ということになります。深夜0時を基準にするにはLinux系では-daystartを指定することができます。ただし、macOSでは-daystartを指定するとエラーになってしまいます。ちなみにMacにUbuntu仮想環境を入れて実行した場合の結果も載せておきます。なんだかんだで仮想環境は便利です。
find ./ -daystart -mtime -2
コマンド実行時から指定した前日までのファイルならマイナスを付けて指定します。
find . -type f -mtime -1
find . -type f -mtime -2
プラス記号を付けた場合は、コマンド実行時基準から指定した日付直前までが対象になります。以下のようにすると過去から3日以前までに変更されたファイルがリストアップされます。
find . -type f -mtime +3
指定した時間内に変更されたファイルの検索
日にちではなく時間を指定する事もできます。今度は先ほどのファイルとは違い以下のようなファイル構成に変更してあります。検索用サンプルですので、ファイルの中身は空っぽです。
以下のようにすると、カレントディレクトリ内にある、1分以内に更新されたファイルが検索されます。
find . -type f -mmin -1
ファイルを作成し1分経過してから同じコマンドを入力すると検索結果は0になります。当然と言えば当然です。
find . -type f -mmin -1
負数でなく正数を指定することもできます。以下のようにすると1分より前に更新されたファイルが検索されます。
find . -type f -mmin +1
ファイルを作成し1分経過してから同じコマンドを入力すると以下のようになります。1分経過したのでnow.txtも検索結果にリストアップされています。
find . -type f -mmin +1
findコマンドのオプションと数値を変えて検索結果がどのようになるのかやってみてください。
findコマンドには他にも様々なオプションがありますが、それはまた別の機会に説明したいと思います。findはgrepと組み合わせることで威力を発揮するのですが、それもまたの機会に。
著者 仲村次郎
いろいろな事に手を出してみたものの結局身につかず、とりあえず目的の事ができればいいんじゃないかみたいな感じで生きております。