Shell-Script
搜尋 pdf 文件並將字元串附加到文件名
我有幾個 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]
將保持為空,這沒關係。因為在兩位數的情況下,數字之間的空格也會匹配,我們使用awk
’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