Puncte:2

Cum să convertiți recursiv toate JPG-urile într-un singur PDF în fiecare folder folosind img2pdf?

drapel us
Sam

Am trei niveluri de foldere, cum ar fi principal, sub-1 și sub-2. folderul meu principal are o mulțime de foldere sub-1 și sub-1 are o mulțime de foldere sub-2 cu imagini JPG în interior.

Copiez fișierele JPG din sub-2 în folderul părinte sub-1 DIN folderul principal folosind această comandă.

găsi . -type f -nume "*.jpg" -exec sh -c 'pentru p; do
  cp „$p” „${p%/*/*}”
gata' _ {} +

Acum trebuie să convertesc toate jpg-urile într-un singur fișier pdf în fiecare folder sub-1 din folderul meu PRINCIPAL, așa că vor exista toate jpg-urile mele copiate împreună cu pdf-urile convertite în sub-1 (numele pdf ar trebui să fie numele folderului, de exemplu: sub- 1). după terminarea conversiei, trebuie să șterg fișierele jpg copiate numai în folderul sub-1 (nu jpg-urile originale), așa că vor exista multe foldere sub-2 cu un singur fișier pdf.

Folosesc biblioteca img2pdf pentru a-mi ascunde imaginile. și am încercat această comandă de mai jos nu face treaba, nu am găsit nicio soluție. Acum, cum fac asta să funcționeze?

găsi . -name '*.jpg' -type f -exec bash -c 'img2pdf *.jpg -o "${PWD##*/}".pdf' {} + \
sudodus avatar
drapel jp
Utilizarea ghilimelelor simple `'` nu va permite probabil ca ${...} să se extindă așa cum s-a dorit.Cred că nu trebuie să împachetați „linia de comandă imp2pdf” în „bash -c „...””.
Sam avatar
drapel us
Sam
Am incercat tot nu functioneaza
sudodus avatar
drapel jp
BINE. A trebuit să verific detaliile prin testare. Vezi răspunsul de mai jos.
Puncte:1
drapel jp

Am făcut câteva teste în arborele directorului meu Fotografii și următorul sistem cu două shellscript-uri funcționează pentru mine.

primul:

#!/bin/bash

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

al doilea:

#!/bin/bash

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

Editați de două ori: script alternativ al doilea face un fișier pdf fără număr de imagini și „imagini” în nume:

#!/bin/bash

num=$(ls "$1"/*.jpg 2> /dev/null | wc -l)
dacă [ $num -ne 0 ]
atunci
 echo -n "."
 img2pdf -o „$1/${1##*/}”.pdf „$1”/*.jpg
fi
  • Copiați și inserați din zonele de cod într-un editor de text și creați fișierele primul și al doilea

  • Faceți-le executabile

    chmod +x prima secundă
    
  • mutați-le într-un director în PATH. Dacă aceasta este doar pentru uzul dvs. personal, [creați și] mutați-le în ~/bin. În caz contrar, dacă alți utilizatori ar trebui să folosească și aceste scripturi shell, mutați-le în /usr/local/bin

    mkdir ~/bin
    mv prima secundă ~/bin
    

    Poate fi necesar să reporniți pentru a obține ~/bin în Calea ta.

Acum sunteți gata să le utilizați. Schimbați directorul în partea de sus sau în arborele directoare, unde aveți fotografiile și rulați primul.

Exemplu (dar ai nume locale, nu imagini precum engleza),

cd ~/Imagini
primul

Va scrie un punct în fereastra terminalului pentru fiecare subdirector unde găsește cel puțin o imagine și creează un fișier pdf.

Puteți găsi fișierele pdf cu următoarea comandă

găsiți -nume „*.pdf”

Editare majoră:

După o discuție cu posterul original, cred că am înțeles structura arborelui de directoare care trebuie procesat. Copiile fișierelor de la nivelurile inferioare sunt localizate în directoarele sub-1 cu numele persoanelor. Fișierele din aceste directoare sub-1 vor fi îmbinate în fișiere pdf.

Exemplu:

$ arbore -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 directoare, 14 fișiere

Dacă schimbați directorul de lucru cu CD unde se află aceste nume-directoare, puteți utiliza următoarele modificări primul shellscript.

#!/bin/bash

find -mindepth 1 -maxdepth 1 -type d -exec secunda {} \;
ecou ""

Va rula al doilea shellscript numai în directoarele de nume și nu căutați ceea ce este în nivelurile [superioare sau inferioare] ale arborelui de directoare.

Următoarele arată cum găsi găsește doar directoarele de nume

$ find -mindepth 1 -maxdepth 1
./adam
./betty
sudodus avatar
drapel jp
Dacă aveți nume de fișiere cu spații, probabil că vor apărea probleme. O soluție poate fi doar comanda cu `img2pdf` într-un al doilea fișier [shellscript] și apelarea shellscript-ului în linia de comandă cu `find`. În acest fel, puteți avea ghilimele duble în jurul fișierelor: `"*.jpg"` în al doilea shellscript mic. O alternativă este înlocuirea spațiilor cu caractere de subliniere: `"nume fișier cu spații"` --> "`nume fișier_cu_linii de subliniere"`.
Sam avatar
drapel us
Sam
Am încercat scriptul dvs., creează pdf-uri goale în fiecare directoare cu nume greșite, numele folderului meu în arabă
sudodus avatar
drapel jp
Funcționează pentru mine cu o limbă non-engleză din Europa de Vest. Este posibil să aveți o problemă din cauza numelor de foldere sau de fișiere. Vă sugerez să creați un al doilea fișier [shellscript] și să îl faceți să funcționeze pentru un singur director. Apoi faceți primul fișier [master shellscript] cu `find` care apelează al doilea shellscript pentru fiecare subdirector care conține fișiere. Poți să faci asta singur sau ai nevoie de ajutor? (Este posibil să aveți nevoie de ajutor de la cineva care folosește aceeași limbă.)
Sam avatar
drapel us
Sam
Sunt complet nou în acest script, domnule, cred că ar putea avea nevoie de ajutor
sudodus avatar
drapel jp
OK @Looper, am adăugat detalii despre cum să faci un sistem cu două scripturi, unde `first` apelează `second` pentru fiecare subdirector. Acest lucru funcționează pentru mine și sper că funcționează și cu arabă. Dacă nu, aveți nevoie de ajutor de la altcineva, care știe arabă și/sau care știe mai bine să gestioneze caracterele speciale în numele fișierelor.
Sam avatar
drapel us
Sam
Rulez scripturile în Ubuntu de la WSL2, deci unde trebuie să muți ambele scripturi shell aici. Sunt confuz (FYI, nu am privilegii de administrator)
sudodus avatar
drapel jp
Să [continuăm această discuție în chat](https://chat.stackexchange.com/rooms/129154/discussion-between-sudodus-and-looper).
sudodus avatar
drapel jp
@Looper OK, nu știam exact ce vrei. M-am gândit că este mai bine să pun ceva în nume, care să evite să dai același nume mai multor fișiere, dar poate că a doua editare a celui de-al doilea fișier va funcționa pentru tine.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.