
我已經嘗試在這裡尋找答案,但沒有找到。我很抱歉我的英文不好,因為說英文對我來說有點困難。我也幾乎沒有 bash 腳本編寫技能,所以我的腳本可能看起來很糟糕。它只是根據我從互聯網上找到的示例製作的,但現在我對此感到困難,所以我需要你們的幫助!
我從這個腳本中需要的是:
- 遞歸查找所有 pdf 檔案(簡單機器論壇對附件進行哈希處理,因此這就是擴展名為 .dat 的原因)
- 從 .dat 檔案中識別 pdf 類型
- 然後我需要使用 ps2pdf 程式來優化所有新的(最後 24 小時)pdf 文件
- 我還需要保留優化 pdf 檔案的原始時間戳
- “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
而不是xargs
:find . -name '*.dat' -mtime -1 -exec file -i {} +
- 如果
ps2pdf
失敗,您仍然可以繼續刪除原始檔案。例如,您可以使用:ps2pdf ... || continue
在失敗時跳到下一個迭代。 - 請使用更具描述性的標題,這樣您的問題也可能對其他人有幫助。