我已经尝试在这里寻找答案,但没有找到。我很抱歉我的英语不好,因为说英语对我来说有点困难。我也几乎没有 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 等等..
"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
而不是xargs
:find . -name '*.dat' -mtime -1 -exec file -i {} +
- 如果
ps2pdf
失败,您仍然可以继续删除原始文件。例如,您可以使用:ps2pdf ... || continue
在失败时跳转到下一次迭代。 - 请使用更具描述性的标题,这样您的问题也可能对其他人有所帮助。