Find

使用 Find -exec 使用文件的 grepped 內容重命名文件

  • July 13, 2018

我正在嘗試使用 find 獲取文件列表,然後使用 pdfgrep 從文件中獲取字元串,然後使用該字元串重命名文件。

分解的命令是:

find . -name "*PayrollSelfBill_42652301*" -exec pdfgrep {}  -o -e "42652301-.{10}"

find 獲取我感興趣的文件, -exec 部分中的 pdfgrep 提取正確的字元串。

我想將 {} 中保存的文件 mv 到 pdfgrep 的輸出。

我嘗試過創建變數(使用 $()/ 反引號)和多個 -exec,但似乎無法正常工作。

有沒有人有優雅的解決方案?

對於單個文件,$filename如果我理解正確,您會想要做類似的事情

mv -i "$filename" "$( pdfgrep "$filename" -o -e "42652301-.{10}" )"

…假設$filename是目前目錄中的文件名。對?如果不是,下面的程式碼也不正確……

find好的,讓我們將其插入-execdir

find . -type f -name "*PayrollSelfBill_42652301*" -execdir sh -c '
   filename=$1
   mv -i "$filename" "$( pdfgrep "$filename" -o -e "42652301-.{10}" )"' sh {} ';'

這將找到您感興趣的文件並在與找到文件的目錄相同的目錄中執行腳本片段(這-execdir與 不同-exec)。

有可能是

find . -type f -name "*PayrollSelfBill_42652301*" \
   -execdir mv -i {} "$( pdfgrep {} -o -e "42652301-.{10}" )" ';'

實際上,如果沒有添加子外殼,它也可以工作……現在我想起來了。但我會覺得呼叫子 shell 更安全,因為-execdirfind.


假設$pathname是找到的文件之一,但它不在目前目錄中,則以下內容對該文件執行相同操作:

mv -i "$pathname" "${pathname%/*}/$( pdfgrep "$pathname" -o -e "42652301-.{10}" )"

在這裡,${pathname%/*}將展開到找到的文件的目錄(與 相同$( dirname "$pathname" ))。

這可能有效

find . -type f -name "*PayrollSelfBill_42652301*" \
   -exec  mv -i {} "$( dirname {} )/$( pdfgrep {} -o -e "42652301-.{10}" )" ';'

但我們可以更高效一點,用於-exec ... {} +批量處理一堆文件:

find . -type f -name "*PayrollSelfBill_42652301*" -exec sh -c '
   for pathname do
       mv -i "$pathname" "${pathname%/*}/$( pdfgrep "$pathname" -o -e "42652301-.{10}" )"
   done' sh {} +

與上述解決方案的不同之-execdir處在於,只會啟動一個(或很少)sh -c腳本,dirname並被更快的替換所取代,使其可能比之前的變體更快。

與此答案中的兩種變體有關:

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