如何使用 pdfcrop 裁剪目录中的多个文件?

如何使用 pdfcrop 裁剪目录中的多个文件?

我想使用 pdfcrop 裁剪文件夹中的所有 pdf 文件,但我对 bash 完全不熟悉。到目前为止,我所做的是:

for file in *.pdf; do
   pdfcrop "$file" "${file%.*}_Cropped.pdf";
done

输出文件的名称应该没问题,因为它给出了想要的结果:

for file in *.pdf; do
   echo "${file%.*}_Cropped.pdf";
done

但对于每个文件 pdfcrop 返回“!!! 错误:从‘my_correct_input_filename’到‘tmp-pdfcrop-some_more_numbers-img.pdf’的链接失败(操作不允许)!” 我的文件名包含空格和 '。是这个原因吗?但它似乎可以正确识别输入文件名。

编辑:当仅将 pdfcrop 与单个文件一起使用时,空格会按预期引起麻烦,因为文件名被解释为多个名称。

答案1

当仅对单个文件使用 pdfcrop 时,空格会像预期的那样造成麻烦,因为文件名被解释为多个名称。

这是不太可能的,因为您在循环中使用了正确引用的参数,所以在这种情况下不会发生任何 shell 字拆分:

for file in *.pdf; do
   pdfcrop "$file" "${file%.*}_Cropped.pdf";
done

那会是什么呢?

在检查源代码pdfcrop,您收到的错误定义在:

if ($symlink_exists) {
    symlink($inputfile, $inputfilesafe)
        or die sprintf "$Error Link from `%s' to `%s' failed (%s)!\n",
                       $inputfile, $inputfilesafe, exterr;

这意味着符号链接创建不成功...pdfcrop在处理之前创建指向具有不安全名称的原始文件的符号链接,如链接源代码的注释部分所述:

# Input files with unsafe file names are linked/copied
# to temporary file with safe file name.

不安全文件名的定义可以在以下源代码行中找到正则表达式

elsif (not $inputfile =~ /^[\w\d\.\-\:\/@]+$/) { # /[\s\$~'"#{}%]/

IE (记住这些都是正则表达式,例如\w是一个单词字符、\d是一个数字、\s是一个空格、\$是一个文字$……等等) 其中任何一个\w\d\.\-\:\/@都被认为是安全的... 但\s\$~'"#{}%输入文件名中的任何一个都不被认为是安全的。

实际上exterr外部错误) 将指示原因,例如,如果文件的名称与它尝试创建的随机链接名称相同,则错误将读取类似的内容file exists...但是,在您的情况下,外部错误读取Operation not permitted最有可能是因为您的工作目录所在的文件系统不支持符号链接...例如,*FAT*文件系统不支持符号链接...因此,将您的工作目录更改为支持符号链接的文件系统(如 Ubuntu 的文件系统)EXT4应该可以解决这个问题。

相关内容