linux

各種OSでのインデックスを使用した高速ファイル名検索と全文検索【Linux編】

投稿日:2019年5月9日

目的

  • CentOS上に存在する全ての「~.java」ファイルをリストアップします。
  • 上記の内「System.out.println」が含まれているファイルを見つけます。

環境

CentOS7.5

使用コマンド

locate [探したいファイル名]
インデックス検索出来るlocateコマンドを使うことでfindコマンドよりも高速に検索します。

ファイル名検索

拡張子「java」のファイルをリストアップする為、-rで正規表現を使います。

$ locate -r "\.java$"
/etc/.java
/opt/fess-12.3.2/~/org/apache/jsp/WEB_002dINF/view/footer_jsp.java
/opt/fess-12.3.2/~/org/apache/jsp/WEB_002dINF/view/index_jsp.java
/opt/fess-12.3.2/~/org/apache/jsp/WEB_002dINF/view/searchOptions_jsp.java
    :
  (snip)

OS内の全ての~.javaファイルパスがリストアップされました。

全文検索

リストアップされた結果をxargsコマンドで一行ずつgrepに渡してやります。

$ locate -r "\.java$" | xargs grep System.out.println
grep: /etc/.java: ディレクトリです
/usr/share/~/VerifyRSAOAEPSHA2.java:        System.out.println("Exception closing files");
/usr/share/~/VerifyRSAOAEPSHA2.java:        System.out.println("Verifying OAEP with mgf1_hash: " + m_mgf1_hash + " alg_hash: " + m_alg_hash + " - "
/usr/share/~/VerifyRSAOAEPSHA2.java:        System.out.println("Vector file path: " + vector_path);
    :
  (snip)

全ての~.javaファイルの中から「System.out.println」文字列を含むjavaファイルがリストアップされました。

補足とインデックス更新

CentOSのminimalインストールではlocateコマンドは初期インストールされていないのでインストールする必要があります。パッケージ名は「mlocate」です。

# yum install mlocate

インストールしたての時はインデックスDBが出来ておらず、locateすると以下のエラーが発生します。

locate: stat () `'/var/lib/mlocate/mlocate.db' できません: そのようなファイルやディレクトリはありません

その場合は以下のコマンドでインデックスDBを作成してください。(最初の一回は時間が掛かります)

# updatedb

mlocateインストール後は以下の/etc/cron.daily/mlocateがインストールされ、一日一回、自動的にupdatedbが走るようになります。

# cat /etc/cron.daily/mlocate
#!/bin/sh
nodevs=$(awk '$1 == "nodev" && $2 != "rootfs" && $2 != "zfs" { print $2 }' < /proc/filesystems)

renice +19 -p $$ >/dev/null 2>&1
ionice -c2 -n7 -p $$ >/dev/null 2>&1
/usr/bin/updatedb -f "$nodevs"

まとめ

cron.dailyで毎日updatedbされるとは言え、直近に作成したファイルはインデックスされておらず結果に出ません。必ずupdatedbを実行してからにするか、findと併用するのが有用です。

find ./ -type f -name "*.java" | xargs grep System.out.println


-linux

執筆者:

関連記事

Linuxのシェルログイン時、cowsayに格言を喋らせる伝統芸能

sshコマンドやteratermでLinuxにログインした時、在り来たりなプロンプトじゃなくて何か役に立つ情報が表示されたら、開発プロジェクトの雰囲気もちょっと潤うかも知れません。 Linuxコマンド …

認証付きHTTPプロキシを認証無しで利用する下位プロキシをsquidで構築

目次1 はじめに2 環境3 手順3.1 squidをインストール3.2 /etc/squid/squid.confを設定4 squid起動4.1 3128ポート開放4.2 各種端末で上記プロキシを設定 …

VirtualBoxにUbuntu18.04をインストール(SSH接続するまで)

2019年も変わらずLinuxディストリシェアトップをキープしたUbuntuをVirtualBoxでインストールします。 マイナビニュース  7 UsersDebianとCentOS下落- …

Linuxコマンドラインでfortuneを日本語翻訳してcowsayに日本語を喋らせる

緊張感が漂うことも多々あるIT開発現場、逼迫した状況が続く際は一服の潤いも必要です。以前、Linuxログインした時にcowsayにfotuneを喋らせる伝統芸能で嗜みました。 One IT Thing …

podman + docker-comopseでwordpressを起動

前回podmanをdockerとして使えるようになりました。 One IT Thing  1 Pocketpodmanをdockerとして使うhttps://one-it-thing.com …

 

shingo.nakanishi
 

東京在勤、1977年生まれ、IT職歴2n年、生涯技術者として楽しく生きることを目指しています。デスマに負けず健康第一。