我使用以下命令将目录中的jpg个文件转换并合并为一个pdf文件.

convert *.jpg file.pdf

目录中的文件编号从1.jpg123.jpg.转换进行得很顺利,但转换后的页面都混在一起了.我希望pdf的页面从1.jpg页到123.jpg页的顺序与它们的名称相同.我还try 了以下命令:

cd 1 
FILES=$( find . -type f -name "*jpg" | cut -d/ -f 2)
mkdir temp && cd temp 
for file in $FILES; do 
    BASE=$(echo $file | sed 's/.jpg//g');
    convert ../$BASE.jpg $BASE.pdf; 
    done && 
pdftk *pdf cat output ../1.pdf && 
cd .. 
rm -rf temp

但还是没有运气.操作平台Linux.

推荐答案

问题是,您的shell正在按纯字母顺序扩展通配符,并且由于数字的长度不同,因此顺序将不正确:

$ echo *.jpg
1.jpg 10.jpg 100.jpg 101.jpg 102.jpg ...

解决方案是在运行convert命令之前,根据需要将文件名填充为零,使其长度相同:

$ for i in *.jpg; do num=`expr match "$i" '\([0-9]\+\).*'`;
> padded=`printf "%03d" $num`; mv -v "$i" "${i/$num/$padded}"; done

现在,文件将以正确的顺序与通配符匹配,准备好执行convert命令:

$ echo *.jpg
001.jpg 002.jpg 003.jpg 004.jpg 005.jpg 006.jpg 007.jpg 008.jpg ...

Linux相关问答推荐

并行函数的最后一个实例的状态

如何检测文件系统是否支持权限?

AWK:按第一列匹配两个文件不起作用

从 ALSA USB 硬件设备获取 USB 设备文件路径

为什么 linux shell diff 命令有时会显示与空行相关的输出,即使存在 -B(--ignore-blank-lines)选项?

无法在嵌入式 Linux 中使用 libjpeg 以 RGB888 在 LCD(黑色)上显示 JPEG

将所有列乘以一个常数

我需要制作一个 awk 脚本来解析文件中的文本.我不确定我是否做得正确

如何恢复已停止的进程?

如何在 Linux 上使用 -grep 构建过滤间隔的命令

Bash 更新 yaml 文件中的图像值

查找更高版本的文件

仅显示 tcsh 或 bash 中作为符号链接的文件和文件夹

为什么 Linux (x86) 的页面大小是 4 KB,这是如何计算的?

为什么 XGrabKey 会生成额外的聚焦和聚焦事件?

用于 Linux 的 Less 编译器

为什么 mmap() 比顺序 IO 快?

在 Linux 上忽略 glob() 中的大小写

bash中变量名后的2个逗号是什么意思?

ngrok 如何在防火墙后工作?