0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

複数のPDFからキーワードを検索するシェルスクリプトを作成してみた

Posted at

背景

日々の業務や技術調査の中で、複数のPDF資料を扱う場面はよくあります。
「この資料の中に特定のキーワードが含まれているか一括で調べたい」と思ったとき、PDFビューアで1つずつ開いて検索するのは正直手間です。

そこで、コマンドラインで複数のPDFから簡単にキーワードを検索できるシェルスクリプトを作ってみました。

はじめに

この記事では、以下のような要件を満たすシェルスクリプトを紹介します。

  • 複数のPDFファイルを対象に検索
  • 日本語のキーワードも正しく扱える(UTF-8対応)
  • 該当ファイルと一致行を表示
  • 該当がなかった場合は「No data found」と表示

GUI不要・依存は最小限、シンプルに動くスクリプトを目指しました。

事前準備

このスクリプトは以下のツールに依存しています。

  • pdftotext(Popplerユーティリティの一部)

インストール方法

  • macOS(Homebrew)
brew install poppler
  • Linux (Ubuntu / Debian)
sudo apt update
sudo apt install poppler-utils

作成したシェルスクリプト

以下が今回作成したスクリプト(search_pdfs.sh)の全体です

#!/bin/bash

KEYWORD="$1"
PDF_DIR="$2"

if [[ -z "$KEYWORD" || -z "$PDF_DIR" ]]; then
  echo "Usage: $0 \"keyword\" /path/to/pdf/directory"
  exit 1
fi

if ! command -v pdftotext &> /dev/null; then
  echo "Error: pdftotext is not installed. Please install poppler-utils (Linux) or poppler (macOS)."
  exit 1
fi

export LANG=ja_JP.UTF-8
export LC_ALL=ja_JP.UTF-8

TEMP_DIR=$(mktemp -d)
FOUND_MATCH=0
PDF_FILES=("$PDF_DIR"/*.pdf)

if [ ${#PDF_FILES[@]} -eq 0 ]; then
  echo "No PDF files found in $PDF_DIR"
  rm -r "$TEMP_DIR"
  exit 0
fi

echo "🔍 Searching for \"$KEYWORD\" in PDFs under \"$PDF_DIR\"..."

shopt -s nullglob
for pdf in "${PDF_FILES[@]}"; do
  base=$(basename "$pdf" .pdf)
  txt_file="$TEMP_DIR/$base.txt"
  pdftotext -enc UTF-8 "$pdf" "$txt_file"

  if grep -q "$KEYWORD" "$txt_file"; then
    echo -e "\n📄 Match found in: $pdf"
    grep --color=always "$KEYWORD" "$txt_file"
    FOUND_MATCH=1
  fi
done

if [ "$FOUND_MATCH" -eq 0 ]; then
  echo -e "\n❌ No data found for keyword \"$KEYWORD\"."
fi

rm -r "$TEMP_DIR"

実行方法

chmod +x search_pdfs.sh
./search_pdfs.sh "機械学習" ./documents

出力例(ヒットあり)

📄 Match found in: ./documents/ai_intro.pdf
このレポートでは、機械学習の基本概念について解説する。

出力例(ヒットなし)

❌ No data found for keyword "機械学習".

ちょっとした工夫ポイント

  • pdftotext -enc UTF-8 を使うことで日本語対応
  • grep --color=always でマッチ部分を強調表示
  • 一致がなかったときもの明示的に「No data found」と出力
  • 一時ファイルは終了後に自動削除

リポジトリ

準備中

まとめ

ちょっとしたニーズから作り始めたこのシェルスクリプトですが、思ったよりも便利でした。
特に、論文や仕様書の中から特定の用語がどこで使われているかをパッと確認したいときに非常に役立ちます。
GUIアプリを使うよりも軽量かつ高速に動作するため、普段からターミナルを使っている方には特におすすめです。

今後のアイデア

  • find を使ってサブディレクトリも含めた再帰検索
  • OCR(tesseract)を導入して画像ベースのPDFにも対応
  • 複数キーワード検索や正規表現対応への拡張
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?