錯誤試行

PCや生活の試行錯誤の成果を報告するブログ

Ubuntu(Linux)でMicrosoft Wordファイル(.doc/.docx)やpdfファイルの文書内容をコマンドラインから検索する

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 
    

関連サイト