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

執筆者:

関連記事

CentOS8にPostgreSQL12をインストールする手順

以前CentOS7にPostgreSQL11をインストールしてSQL実行しました。 One IT Thing  1 Pocket開発用PostgreSQLをCentOSにインストールしてSQ …

podmanをdockerとして使う

docker代替としてRHEL系OSにデフォルト搭載されたpodmanは当初、dockerを期待している他周辺ソフトウェア(docker-componseやgitlab-runnerなど)と素直に通信 …

Linux、Macでハードディスクが一杯になった時の対処

「いつの間にかハードディスク一杯になってた・・・」 運用側が10:0で言い訳出来ない障害の一つなんじゃないでしょうか。 怖い先輩(上役)に体育館裏(会議室)に連れていかれる恐怖を思い出します。 運管ミ …

テキストファイル内の改行コード差異を見つけるワンライナー

ファイル内容は同じなのにdiffで違いが出るWeb上でソースレビューする時に同じ内容の行なのに差分が出て紛らわしい これらの原因はWindows、Mac、Linuxが入り混じった、改行コードが統一され …

pgadmin4をCentOS7にインストールしてサーバモードで起動する手順

目次1 はじめに1.1 pgadmin3時代1.2 pgadmin4時代2 前提3 環境4 手順4.1 1.yumリポジトリ追加。pgdg(ポスグレ本家)、epel(python関連用)4.2 2.p …

 

shingo.nakanishi
 

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