需要 Linux bash 腳本的幫助,遞歸查找 pdf 檔案並優化它們,保留原始時間戳

需要 Linux bash 腳本的幫助,遞歸查找 pdf 檔案並優化它們,保留原始時間戳

我已經嘗試在這裡尋找答案,但沒有找到。我很抱歉我的英文不好,因為說英文對我來說有點困難。我也幾乎沒有 bash 腳本編寫技能,所以我的腳本可能看起來很糟糕。它只是根據我從互聯網上找到的示例製作的,但現在我對此感到困難,所以我需要你們的幫助!

我從這個腳本中需要的是:

  1. 遞歸查找所有 pdf 檔案(簡單機器論壇對附件進行哈希處理,因此這就是擴展名為 .dat 的原因)
  2. 從 .dat 檔案中識別 pdf 類型
  3. 然後我需要使用 ps2pdf 程式來優化所有新的(最後 24 小時)pdf 文件
  4. 我還需要保留優化 pdf 檔案的原始時間戳
  5. “24h-pdf-compress-” date +"%d-%m-%Y"“.txt”檔案僅用於記錄內容,因此我可以稍後檢查它是否正常工作。

Smf-論壇附件目錄架構如下:

在附件資料夾下方有一個按年份(2020)的資料夾。
每年下面都有月份資料夾(04 = 四月)。
每個月下方都是該月的所有附件文件。
每個檔案(jpg、png、pdf)都有相同的 .dat 副檔名。

/var/www/foorumi/attachments/2020/04/all-files-from-april.dat

我的腳本:

#!/bin/bash

cd /var/www/foorumi/attachments

find . -name '*.dat' -mtime -1 | xargs file -i | grep 'pdf' | cut -d: -f1 > "24h-pdf-compress-"`date +"%d-%m-%Y"`".txt"
find . -name '*.dat' -mtime -1 | xargs file -i | grep 'pdf' | cut -d: -f1 | while read -r file

do
        touch -r "$file" "dummy_file"
        ps2pdf "$file" "new_$file" # PROBLEM
        rm "$file"
        mv "new_$file" "$file" # PROBLEM
        touch -r "dummy_file" "$file"
        rm dummy_file
done

mv "24h-pdf-compress-"`date +"%d-%m-%Y"`".txt" /root/24h_pdf_compress_log
find . -iname '*.dat' -user root -exec chown www-data:www-data {} \;

exit 0

好的,問題如下。當我運行時,find . -name '*.dat' -mtime -1 | xargs file -i | grep 'pdf' | cut -d: -f1它會列印諸如 之類的文件./04/somepdfattachment.dat,因此當腳本運行時,ps2pdf "$file" "new_$file"它會嘗試創建諸如new_./04/somepdfattachment.dat.. 之類的新文件名,這聽起來不正確。

當腳本嘗試重新命名 file 時,會出現下一個錯誤mv "new_$file" "$file",因為現在它嘗試將new_./04/somepdfattachment.dat檔案重新命名回原始檔案名稱。

我希望你能理解我試圖告訴你的事情。如果需要,我可以提供更多資訊。

先致謝!

更新! 就像 @pLumo 建議的那樣,我修改了腳本,它現在似乎可以工作了。我希望我正確地理解建議..

Simple Machines 論壇附件的命名方式如下: 403_57066cef00fb1d57137b5613f076d254e89b88bc.dat
"403" = 附件的運行編號,下一個是 404,下一個是 405 等等..
"570666 等等
。所有附件上傳後,副檔名(jpg、png、pdf)被重新命名為.dat。

更新的腳本:

...
do
        touch -r "$file" "dummy_file"
        newname="$(dirname "$file")/new_$(basename "$file")"
        ps2pdf "$file" "$newname" || continue
        rm "$file"
        mv "$newname" "$file"
        touch -r "dummy_file" "$file"
        rm dummy_file
done
...

答案1

您需要將$file其拆分為路徑 ( dirname) 和檔案名稱 ( basename) 並將其放在new_中間:

newname="$(dirname "$file")/new_$(basename "$file")"
ps2pdf "$file" "$newname"

附加提示:

  • 當結果中有換行符時,您的find命令並不安全,它會搞砸您的結果。您可能希望熟悉零分隔符號以安全地管道檔案名稱。
  • 我認為如果你的檔案名稱中有冒號,你的檔案cut會在錯誤的地方分割,這同樣適用。
  • 使用-exec而不是xargsfind . -name '*.dat' -mtime -1 -exec file -i {} +
  • 如果ps2pdf失敗,您仍然可以繼續刪除原始檔案。例如,您可以使用: ps2pdf ... || continue在失敗時跳到下一個迭代。
  • 請使用更具描述性的標題,這樣您的問題也可能對其他人有幫助。

相關內容