今回はUNIX系のOSでfindコマンドを使ってテキストファイルを検索します(Windowsでの検索については別の回で説明します)。以前やったテキストの置換と組み合わせて使うと役立つかもしれません。また内容を検索するgrepと組み合わせて使うとさらに便利です。findはこれまでも何回か使ってきましたが、今回はもう少しうまく使ってみましょう。
と、その前にlsコマンドについても、もう少し詳しく説明します。
ファイルをリストアップ
ここで使用するサンプルファイルとディレクトリ構成は以下のようになっています。これまでと同じようにデスクトップ上にsampleフォルダを用意し、そこに対象となるファイルを用意しています。
このsampleディレクトリをカレントディレクトリとします。cdコマンドで以下のように入力すればデスクトップ上にあるsampleディレクトリがカレントディレクトリになります。
特定のディレクトリ内にあるファイルを検索する、リストアップするならこれまでにも使ってきたlsコマンドでもよいでしょう。
もっとも、これまでは特定の拡張子を持つファイルをリストアップするだけという簡単な使い方ばかりでした。bashやzshなどのシェルには、特定のファイルをリストアップするための機能があります。*.jpgで拡張子がjpgのファイルだけをリストアップしたり、*.{jpg,png}で複数の拡張子を持つファイルをリストアップするといった機能です。
シェルには、これ以外にも多くの指定方法があります。ここでは、よく使いそうな指定について説明しましょう。
なお、ここではもっとも多く使用するlsコマンドで説明します。一部他のコマンドでは使えない指定もあります。
◆◆ *
*を使うとその部分は何の文字にもマッチします。*記号での指定はこれまでに何度も使ってきました。特定の拡張子を持つファイルをリストアップする場合に多く使用されます。例えばカレントディレクトリ内の拡張子txtのファイルをリストアップするには以下のように指定します。
ls *.txt
このような指定方法はUNIX系のシェルだけでなく、古くはMS-DOSでも使う事ができました。ちなみにMS-DOSだとDIRコマンドになります。今となっては古いのか懐かしいのか、なんともな郷愁を感じますが、図のような感じになります。さらに古いところではCP/M,CP/M86というのもありました。
特定の拡張子ではなく拡張子だけが異なるファイルをリストアップするには以下のようになります。
ls sample.*
*はファイル名全体ではなく一部にも指定できます。例えば2021で始まる拡張子がtxtのファイルをリストアップする場合は以下のように指定します。
ls 2021*.txt
◆◆ .
*は0個以上の文字なら何でもマッチしますが、?は1個の文字にマッチします。
以下のようにすると拡張子がtxtの1文字のファイル名だけがピックアップされます。
ls ?.txt
◆◆ -による範囲指定
-を使うと数値や文字の範囲を指定できます。データファイル名が年月日になっていて、特定の年月日だけリストアップしたい場合には便利です。
例えば202105や202112のような4桁と2桁の年月のテキストファイルがあり、その中から1月から6月分をリストアップしたい場合は以下のように指定します。
ls 20210[1-6].txt
年数に関係なく1月から6月までのファイルをリストアップする場合は以下のようになります。
ls *0[1-6].txt
◆◆ 不連続
範囲ではなくバラバラに指定したい場合があるかもしれません。そのような場合は{ }を使います。これまでにも複数の拡張子のファイルをリストアップする際に使用してきました。{ }の中に,で区切って複数のマッチする文字を指定します。
例えば4桁の年と2桁の月がファイル名になっているとして、2021年の2月と5月と6月のデータファイルをリストアップするには以下のように指定します。
ls 20210{2,5,6}.txt
10月や12月なども考慮すると以下のようになります。
ls 2021{02,05,06,10,12}.txt
◆◆ Rオプション
ここまではカレントディレクトリもしくは特定のディレクトリが対象でした。場合によってはサブディレクトリも対象にしたい場合もあります。そのような場合はRオプションを指定します。
ls -R
Rオプションの場合、サブディレクトリ内も表示してくれますが、その中にある拡張子がtxtのみ得たい場合もあります。ぱっと思い浮かぶところでは以下のように指定すればよさそうです。
ls -R *.txt
実行すると期待とは違った結果になってしまいます。
このような場合は以下のようにgrepと組み合わせるとよいでしょう。
ls -R | grep -E ".txt$"
◆◆ mオプション
出力した結果をCSV形式として利用したい場合に便利なのが、このmオプションです。このオプションを指定すると出力結果を,で区切って出力します。
ls -m *.txt
リダイレクト( > )を使えば出力結果をファイルに保存できます。
ls -m *.txt > ~/Desktop/data.csv