因此,为了找到我需要创建的丢失的.pdf文件,我去了cygwin并尝试了一些如下命令:
$ find -name *.jpg -exec ls '{}/.jpg/pdf' \;
我希望这能将 {} 视为变量,用 .pdf 替换 .jpg,但替换并未发生。我该怎么做?
$ find -name *.jpg -exec ls '{}/.jpg/pdf' \;
请看下面:
find . -name '*.jpg' -exec \
sh -c 'pdf="${1%.jpg}".pdf; test -f "$pdf" || echo missing: $pdf' -- {} \;
{}
传递给子 Shell 作为命令行参数,这样您就可以在 shell 变量中使用模式替换,在本例中为 $1
(第一个命令行参数)。"${1/.jpg/pdf}"
也可以工作,但 "${1%.jpg}".pdf
更准确。sh
进程。更高效但有点长的解决方案:find . -name '*.jpg' -print0 | while read -d $'' f; do \
pdf="${f%.jpg}".pdf; test -f "$pdf" || echo missing: $pdf; done
顺便问一下,这是个好主意吗?
不是的。PDF的 DCTDecode
滤波器需要JPG文件“原样”输入,这可能就是您想要的——将JPEG放入PDF容器中,而不进行任何重新压缩,并且没有您或任何软件触摸JPEG内容。因此,不仅Acrobat,而且例如在您的树上使用 ImageMagick 也不是一个好主意。我想不到现成的工具来将JPEG包装成PDF,但可以通过小程序帮助。
use strict;
use warnings;
use File::Find;
use PDF::Reuse;
use Image::Info qw(image_info dim);
find(sub {
return unless /\.jpg$/i;
my ($w, $h) = dim(image_info($_));
prFile($_.'.pdf');
prMbox(0, 0, $w, $h);
prAdd("q $w 0 0 $h 0 0 cm /".prJpeg($_, $w, $h)." Do Q\n");
prEnd()
}, $ARGV[0]);
它应该非常快,期望树根作为参数,并且只是像我说的那样:将你的JPG格式转换为PDF格式。
p.s. 至少需要一些检查--检查 $w 和 $h 是否定义?PDF::Reuse 允许记录日志,可能会有帮助。
p.p.s. 注意,此模块假定 RGB 格式,但如果您的 JPG 格式可以是灰度或 CMYK 格式--在 image_info 哈希中检查并对 PDF::Reuse 源代码进行小修改。它还假定 72 dpi -- 否则,也请检查 image_info 哈希中的分辨率并调整上面的 prMbox 和 prAdd 调用的参数。
另一个更新:
以上代码是 Perl 代码。在 Windows 上,您可以安装 ActiveState 的版本(然后使用其 PPM 实用程序添加模块),或者 Strawberry Perl(并使用 cpan 客户端安装模块)。File::Find 是核心模块。PDF::Reuse 和 Image::Info 需要手动安装。
安装好这些,然后将以上源代码保存为例如 jpegs_2_pdfs.pl,将几个RGB jpeg 示例放入某个文件夹中(树状结构内部或仅是简单列表--现在不重要),然后从命令提示符中运行:
perl jpegs_2_pdfs.pl path_to_my_folder
convert file.jpg -compress JPEG file.pdf
绝对可以忽略不计。 Convert
是ImageMagick的工具,如果您不懂编程(只需为您的树创建一个批处理文件),这可能是您的选择。
同时,请注意,当您说“jpg混合彩色/灰度/黑白”时,这是不可能的,因为您不能将二值图像保存为jpeg格式。
$''
将输入分隔符设置为 NULL,这是因为我们使用了-print0
。--
是为了使其后的参数被设置为$1 $2 ...
变量中的位置参数。 - janos