我想使用 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
应该可以解决这个问题。