Рейтинг:2

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

флаг us
Sam

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

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

найти . -type f -name "*.jpg" -exec sh -c 'для p; делать
  cp "$p" "${p%/*/*}"
сделано' _ {} +

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

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

найти . -name '*.jpg' -type f -exec bash -c 'img2pdf *.jpg -o "${PWD##*/}".pdf' {} + \
sudodus avatar
флаг jp
Использование одинарных кавычек `'`, вероятно, не позволит расширить ${...} так, как предполагалось.Я думаю, вам не нужно оборачивать "командную строку imp2pdf" в "bash -c" ...'`
Sam avatar
флаг us
Sam
пробовал все равно не работает
sudodus avatar
флаг jp
ХОРОШО. Пришлось проверять детали путем тестирования. Смотрите ответ ниже.
Рейтинг:1
флаг jp

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

первый:

#!/бин/баш

find * -type d -exec second {} \;
эхо ""

второй:

#!/бин/баш

num=$(ls "$1"/*.jpg 2> /dev/null | wc -l)
если [$num-ne 0]
тогда
 эхо -н "."
 img2pdf -o "$1/${1//\//-}_${num}_pictures".pdf "$1"/*.jpg
фи

Изменить дважды: альтернативный сценарий второй создает pdf-файл без количества картинок и «картинок» в названии:

#!/бин/баш

num=$(ls "$1"/*.jpg 2> /dev/null | wc -l)
если [$num-ne 0]
тогда
 эхо -н "."
 img2pdf -o "$1/${1##*/}".pdf "$1"/*.jpg
фи
  • Скопируйте и вставьте области кода в текстовый редактор и создайте файлы первый и второй

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

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

    мкдир ~/бин
    mv первая секунда ~/bin
    

    Вам может потребоваться перезагрузка, чтобы получить ~/бен в свой ПУТЬ.

Теперь вы готовы их использовать. Смените каталог на самый верх или дерево каталогов, где находятся ваши картинки и запустите первый.

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

компакт-диск ~/Изображения
первый

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

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

найти -имя "*.pdf"

Основное редактирование:

После обсуждения с автором оригинального постера я думаю, что понял структуру дерева каталогов, которое необходимо обработать. Копии файлов более низких уровней находятся в каталогах sub-1 с именами людей. Файлы в этих подкаталогах 1 должны быть объединены в pdf-файлы.

Пример:

$ дерево -U
.
ââ Адам
âââ 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
âââ Адам.pdf
âââ Бетти
    âââ 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
    âââ Бетти.pdf

6 каталогов, 14 файлов

Если вы измените рабочий каталог с помощью CD туда, где находятся эти каталоги имен, вы можете использовать следующие модифицированные первый шеллскрипт.

#!/бин/баш

find -mindepth 1 -maxdepth 1 -type d -exec second {} \;
эхо ""

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

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

$ найти -минглубина 1 -максимальная глубина 1
./Адам
./Бетти
sudodus avatar
флаг jp
Если у вас есть имена файлов с пробелами, вероятно, будут проблемы. Одно из решений может состоять в том, чтобы поместить команду с `img2pdf` в небольшой второй файл [shellscript] и вызвать шеллскрипт в командной строке с помощью `find`. Таким образом, вы можете заключать файлы в двойные кавычки: `"*.jpg"` в маленьком втором шелл-скрипте. Альтернативой является замена пробелов символами подчеркивания: `"имя файла с пробелами"` --> "`имя_файла_с_подчеркиванием"`.
Sam avatar
флаг us
Sam
Я попробовал ваш скрипт, он создает пустые PDF-файлы в каждом каталоге с неправильными именами, имя моей папки на арабском языке
sudodus avatar
флаг jp
Это работает для меня с неанглийским западноевропейским языком. Возможно, у вас проблема из-за имен папок или имен файлов. Я предлагаю вам создать второй файл [shellscript] и заставить его работать для одного каталога. Затем создайте первый [основной шелл-скрипт] с помощью `find`, который вызывает второй шелл-скрипт для каждого подкаталога, содержащего файлы. Вы можете сделать это сами или вам нужна помощь? (Вам может понадобиться помощь человека, говорящего на том же языке.)
Sam avatar
флаг us
Sam
Я совершенно новичок в этих скриптах, сэр, думаю, может понадобиться помощь.
sudodus avatar
флаг jp
ОК, @Looper, я добавил подробности о том, как создать систему с двумя сценариями, где «первый» вызывает «второй» для каждого подкаталога. Это работает для меня, и я надеюсь, что это работает и с арабским языком. Если нет, вам нужна помощь кого-то еще, кто знает арабский язык и/или кто лучше знает, как управлять специальными символами в именах файлов.
Sam avatar
флаг us
Sam
Я запускаю сценарии в Ubuntu с помощью WSL2, так что куда мне нужно переместить сюда оба сценария оболочки. Я в замешательстве (к вашему сведению, у меня нет прав администратора)
sudodus avatar
флаг jp
Давайте [продолжим это обсуждение в чате](https://chat.stackexchange.com/rooms/129154/discussion-between-sudodus-and-looper).
sudodus avatar
флаг jp
@Looper Хорошо, я точно не знал, чего ты хочешь. Я подумал, что лучше добавить что-то в имя, чтобы избежать присвоения одного и того же имени нескольким файлам, но, возможно, вам подойдет второе редактирование второго файла.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.