У меня есть три уровня папок: главная, 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' {} + \
Я провел несколько тестов в моем дереве каталогов 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