如何使用 img2pdf 递归地将每个文件夹中的所有 JPG 转换为一个 PDF?

如何使用 img2pdf 递归地将每个文件夹中的所有 JPG 转换为一个 PDF?

我有三个级别的文件夹,如主文件夹、子 1 和子 2。我的主文件夹有很多子 1 文件夹,而子 1 有很多子 2 文件夹,里面有 JPG 图像。

我使用此命令将 JPG 文件从主文件夹复制到其父子文件夹 1。

find . -type f -name "*.jpg" -exec sh -c 'for p; do
  cp "$p" "${p%/*/*}"
done' _ {} +

现在我必须将我的主文件夹中的每个子 1 文件夹内的所有 jpg 转换为一个 pdf 文件,因此子 1 中会有我所有复制的 jpg 以及转换后的 pdf(pdf 名称应为文件夹名称,例如:子 1)。转换完成后,我必须仅删除子 1 文件夹内的复制的 jpg(而不是原始 jpg),因此会有许多子 2 文件夹和一个 pdf 文件。

我正在使用 img2pdf 库来转换我的图像。我尝试了下面的命令,但它不起作用,我找不到任何解决方案。现在我该如何让它工作?

find . -name '*.jpg' -type f -exec bash -c 'img2pdf *.jpg -o "${PWD##*/}".pdf' {} + \

答案1

我在我的照片目录树中做了一些测试,以下带有两个 shell 脚本的系统对我来说是可行的。

first

#!/bin/bash

find * -type d -exec second {} \;
echo ""

second

#!/bin/bash

num=$(ls "$1"/*.jpg 2> /dev/null | wc -l)
if [ $num -ne 0 ]
then
 echo -n "."
 img2pdf -o "$1/${1//\//-}_${num}_pictures".pdf "$1"/*.jpg
fi

编辑两次:替代脚本second制作一个不包含图片数量且名称中不包含“图片”的 pdf 文件:

#!/bin/bash

num=$(ls "$1"/*.jpg 2> /dev/null | wc -l)
if [ $num -ne 0 ]
then
 echo -n "."
 img2pdf -o "$1/${1##*/}".pdf "$1"/*.jpg
fi
  • 从代码区域复制并粘贴到文本编辑器中,并创建文件firstsecond

  • 使它们可执行

    chmod +x first second
    
  • 将它们移动到 PATH 中的目录。如果这仅供您个人使用,请[创建并]将它们移动到~/bin。否则,如果其他用户也应该使用这些 shellscript,请将它们移动到/usr/local/bin

    mkdir ~/bin
    mv first second ~/bin
    

    您可能需要重新启动才能进入~/bin您的 PATH。

现在您就可以使用它们了。将目录更改为包含图片的顶部或目录树,然后运行first

例子(但您有当地名称,而不是像英文那样的图片),

cd ~/Pictures
first

它会在每个子目录中的终端窗口中写入一个点,在该子目录中至少找到一张图片并创建一个 pdf 文件。

你可以使用以下命令找到 pdf 文件

find -name "*.pdf"

主要編輯

与原始发帖人讨论后,我想我了解了要处理的目录树的结构。较低级别的文件的副本位于具有人名的子 1 目录中。这些子 1 目录中的文件将合并为 pdf 文件。

例子:

$ tree -U
.
├── adam
│   ├── mkusb-minp-2-crop.jpg
│   ├── us_keyboard_for_sudo_password.jpg
│   ├── nautilus-connect-to-server-2.jpg
│   ├── pict1
│   │   ├── mkusb-minp-2-crop.jpg
│   │   └── nautilus-connect-to-server-2.jpg
│   ├── pict2
│   │   └── us_keyboard_for_sudo_password.jpg
│   └── adam.pdf
└── betty
    ├── nautilus-connect-to-server-1.jpg
    ├── mkusb-minp-3-cropx.jpg
    ├── pict1
    │   ├── nautilus-connect-to-server-1.jpg
    │   └── calamares-mount-failed.jpg
    ├── pict2
    │   └── mkusb-minp-3-cropx.jpg
    ├── calamares-mount-failed.jpg
    └── betty.pdf

6 directories, 14 files

如果将工作目录更改为cd这些名称目录所在的位置,则可以使用以下修改后的firstshellscript。

#!/bin/bash

find -mindepth 1 -maxdepth 1 -type d -exec second {} \;
echo ""

它将second仅在名称目录中运行 shell 脚本,而不会查找目录树的 [上层或] 下层中的内容。

下面显示了如何find仅查找名称目录

$ find -mindepth 1 -maxdepth 1
./adam
./betty

相关内容