Ubuntu(Linux)でpdfやwordをはじめとしたさまざまな文書ファイルの中身の文字列を横断検索するには「Recoll」を使うのが簡単だが(複数pdfを横断検索する方法の検討 - 錯誤試行を参照。Windows版・Mac版もあり)、事前にRecollにディレクトリを登録してインデックスを構築しておく必要がある。
普段は検索しないが今回に限り検索したいディレクトリがある、という場合に、いちいちRecollに登録するのも手間がかかる。そこで、特定のディレクトリ以下にあるMicrosoft Wordファイル(「.doc/.docx」)やpdfファイルの中身をコマンドラインから検索する方法を調べたのでメモしておく。
(Recollでインデックスに登録したpdfをコマンドラインから検索するには「Recoll(端末から検索する)」を参照)
最初に「catdoc」「docx2txt」「poppler-utils」パッケージをインストールする。
sudo apt-get install catdoc docx2txt poppler-utils
- 「.doc」ファイルの中身を検索する
カレントディレクトリとサブディレクトリ以下にある「.doc」ファイル名と「ほげ」という文字列を含んだ箇所を表示する(行番号を付けて、ヒットした行の前後3行を表示)。find . -name "*.doc" | while read LINE; do echo "-----`ls "$LINE"`-----"; catdoc "$LINE" | grep -n -A 3 -B 3 "ほげ"; done | less
- 「.docx」ファイルの中身を検索する
カレントディレクトリとサブディレクトリ以下にある「.docx」ファイル名と「ほげ」という文字列を含んだ箇所を表示する(同上)。find . -name "*.docx" | while read LINE; do echo "-----`ls "$LINE"`-----"; docx2txt "$LINE" - | grep -n -A 3 -B 3 "ほげ"; done | less
- pdfファイルの中身を検索する
カレントディレクトリとサブディレクトリ以下にあるpdfファイル名を表示し、「ほげ」という文字列を含んだ箇所を表示する(同上)。
pdfファイルが多いとだいぶ時間がかかるので、素直にインデックス登録型のデスクトップ検索ソフトを利用した方がよい。
(Recollでインデックスに登録したpdfをコマンドラインから検索するには「Recoll(端末から検索する)」を参照)find . -name "*.pdf" | while read LINE; do echo "-----`ls "$LINE"`-----"; pdftotext "$LINE" - | grep -n -A 3 -B 3 "ほげ"; done | less
- 「.docx」ファイルの中身を検索する(pandocコマンドを使用)
「pandoc」というコマンドでも「.docx」ファイルの検索ができるが、上記の「docx2txt」の方が「.docx」ファイルに特化しているためか検索速度が速いのでおすすめ。なお、pandocコマンドは残念ながらpdfファイルの読み込みはできない。pdfファイルが読み込みできれば、docxとpdfファイルを一度に検索できて便利だったのだが。sudo apt-get install pandoc find . -name "*.docx" | while read LINE; do echo "-----`ls "$LINE"`-----"; pandoc "$LINE" -t plain | grep -n -A 3 -B 3 "ほげ"; done | less
関連サイト
- bash — forループのスペースを含むファイル名、findコマンド (ShawnMilo2014/07/17)
- 【 pdftotext 】コマンド――PDFファイルからテキストを抽出する:Linux基本コマンドTips(286) - @IT
- Pandoc User’s Guide 日本語版 — 日本Pandocユーザ会
さまざまな文書フォーマットを相互に変換できるコマンドラインツール「pandoc」。pdfが読み取れれば便利だったが、残念ながらpdfには対応していなかった(pdfの「出力」には対応している)。
Pandocは、あるマークアップ形式から他の形式へ変換する Haskell ライブラリと、そのライブラリを用いたコマンドラインツールです。
Pandoc は、 Markdown 、 HTML 、LaTeX 、 Word docx など、これに限定されない多数のマークアップとワープロ形式の間で変換することができます。