Как рекурсивно преобразовать все JPG в один PDF в каждой папке с помощью img2pdf?

У меня есть три уровня папок: главная, sub-1 и sub-2. В моей главной папке много папок sub-1, а в sub-1 много папок sub-2 с изображениями JPG внутри.

Я копирую файлы JPG из папки sub-2 в ее родительскую папку sub-1 из главной папки с помощью этой команды.

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

Теперь мне нужно преобразовать все jpg в один pdf файл внутри каждой папки sub-1 из моей папки MAIN, так что в sub-1 будут все скопированные jpg вместе с преобразованным pdf (имя pdf должно быть именем папки, например: sub-1). после завершения преобразования мне нужно удалить скопированные jpg только внутри папки sub-1 (не оригинальные jpg), так что будет много папок sub-2 с одним pdf файлом.

Я использую библиотеку img2pdf для конвертирования изображений. и я попробовал эту команду ниже, она не работает, я не смог найти никакого решения. Как мне сделать так, чтобы это работало?

find . -name '*.jpg' -type f -exec bash -c 'img2pdf *.jpg -o "${PWD##*/}".pdf' {} + \
2
задан 1 September 2021 в 13:15

1 ответ

Я провел несколько тестов в моем дереве каталогов Photos, и следующая система с двумя сценариями оболочки работает для меня.

первый :

#!/bin/bash

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

второй :

#!/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

Редактировать дважды: Альтернативный сценарий второй создает файл 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
  • Скопируйте и вставьте из областей кода в текстовый редактор и создайте файлы первый и второй

  • Сделайте их исполняемыми

     chmod + x first second 
     
  • move их в каталог в PATH. Если это только для вашего личного использования, [создайте и] переместите их в ~ / bin . В противном случае, если другие пользователи также должны использовать эти сценарии оболочки, переместите их в / usr / local / bin

     mkdir ~ / bin 
    mv first second ~ / bin 
     

    Вы можете необходимо перезагрузить, чтобы получить ~ / bin в ваш PATH.

Теперь вы готовы их использовать. Перейдите в каталог вверху или в дерево каталогов, где у вас есть изображения, и сначала запустите .

Пример (но у вас есть локальные имена, а не изображения, такие как английские),

cd ~/Pictures
first

Он запишет точку в окно терминала для каждого подкаталога, где найдет хотя бы одно изображение и создаст файл pdf.

Вы можете найти файлы pdf с помощью следующей команды

find -name "*.pdf"

Major edit :

После обсуждения с оригинальным постером, я думаю, что понял структуру дерева каталогов, которое нужно обработать. Копии файлов на более низких уровнях находятся в подкаталогах под-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 туда, где расположены эти каталоги имен, вы можете использовать следующий измененный первый сценарий оболочки.

#!/bin/bash

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

Он будет запускать второй сценарий оболочки только в каталогах имен и не искать то, что находится на [верхних или] нижних уровнях дерева каталогов.

Ниже показано, как find находит только каталоги имен

$ find -mindepth 1 -maxdepth 1
./adam
./betty
1
ответ дан 4 September 2021 в 09:25

Другие вопросы по тегам:

Похожие вопросы: