我有三个级别的文件夹,如主文件夹、子 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
从代码区域复制并粘贴到文本编辑器中,并创建文件
first
和second
使它们可执行
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
这些名称目录所在的位置,则可以使用以下修改后的first
shellscript。
#!/bin/bash
find -mindepth 1 -maxdepth 1 -type d -exec second {} \;
echo ""
它将second
仅在名称目录中运行 shell 脚本,而不会查找目录树的 [上层或] 下层中的内容。
下面显示了如何find
仅查找名称目录
$ find -mindepth 1 -maxdepth 1
./adam
./betty