需要 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 等等..
"57066cef00..." = 是随机哈希
".dat"= 所有附件扩展名(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在失败时跳转到下一次迭代。
  • 请使用更具描述性的标题,这样您的问题也可能对其他人有所帮助。

相关内容