PDFファイルの検索とファイル名に文字列を追加する

PDFファイルの検索とファイル名に文字列を追加する

PDFファイルが複数あり、すべて「READING nn」という文字列が含まれています。ここで、nnはその読み取り値の番号です。各文字の間には「READING 1 0」というスペースが 1 つあります。

各ファイルから数字nを検索し、その数字をファイルの先頭に追加するbashスクリプトを作成したいと思います。たとえば、スクリプトがname.pdfで「READING 1」を見つけた場合は、ファイル名を1.name.pdfなどに変更する必要があります。

どうすればいいですか?

ありがとう

ベストアンサー1

あなたの質問に対する答えは、この文字列が発生する可能性があるかどうかによって異なります。一度または検討中のPDFファイル内で何度も。一度だけ起こることができると仮定すると、そして問題の文字列は実際のテキスト(つまりグラフィック形式ではない)として含まれており、次のアプローチ(GNU Awkと外部ツールが必要ですpdftotext)が機能するはずです(例は引数として渡された単一のファイルに対して機能します)。

#!/bin/bash

OLDNAME="$1"

NUMBER="$(pdftotext "$OLDNAME" - | awk '/R E A D I N G/ {match($0,"R E A D I N G ([[:digit:]])( [[:digit:]])*",a); gsub(" ","",a[2]); print a[1] a[2];}')"

NEWNAME="$NUMBER.$OLDNAME"
mv "$OLDNAME" "$NEWNAME"

match特定のパターンが存在することを確認しawk、そのパターンの「実際の値」を出力配列に出力します。aここで、エントリには、a[0]見つかったパターン全体が含まれ、パターン内の括弧で囲まれたサブ式の「実際の値」がa[1]含まれます。a[n]私たちの場合、配列項目1と2の「数字部分」です([[:digit:]])( [[:digit:]])*(例:GNU Awkユーザーガイドの「文字列関数」セクション)。結果が1桁の場合は空にしてa[2]も構いません。 2桁の数字の場合、数字の間のスペースも一致するため、2桁の数字の場合はawks関数を使用してそれらを削除します。gsub()

複数のファイルに適用するには、次のようにスクリプトを変更し、PDFファイルの完全なリストをパラメータ(たとえば./rename.sh *.pdf)に渡します。

#!/bin/bash

for OLDNAME in "$@"
do
    NUMBER="$(pdftotext "$OLDNAME" - | awk '/R E A D I N G/ {match($0,"R E A D I N G ([[:digit:]])( [[:digit:]])*",a); gsub(" ","",a[2]); print a[1] a[2];}')"

    NEWNAME="$NUMBER.$OLDNAME"
    mv "$OLDNAME" "$NEWNAME"
done

おすすめ記事