Shell-Script

搜尋 pdf 文件並將字元串附加到文件名

  • February 17, 2020

我有幾個 PDF 文件都包含字元串“READING n n”,其中 nn 是相應閱讀的編號。每個字元之間正好有一個空格,即“READING 1 0”。

我想編寫一個 bash 腳本來搜尋每個文件中的數字 n 並將該數字附加到文件的開頭。例如,如果腳本在 name.pdf 中找到“READING 1”,則必須將文件名重命名為 1.name.pdf 等。

怎麼做?

謝謝

您的問題的答案取決於此字元串在所考慮的 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]括號中的任何子表達式的“實際值”在模式中,在我們的例子([[:digit:]])( [[:digit:]])*中,數組條目 1 和 2 中的“數字部分”(參見例如GNU Awk 使用者指南中關於“字元串函式”的部分)。如果結果是個位數的數字a[2]將保持為空,這沒關係。因為在兩位數的情況下,數字之間的空格也會匹配,我們使用awkgsub()函式在兩位數的情況下將其刪除。

為了將其應用於多個文件,您可以按如下方式修改腳本,然後將整個 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

引用自:https://unix.stackexchange.com/questions/548062