Comando "trova" -exec che sostituisce la stringa


1

Sto cercando di trovare file JPG in un albero di cartelle per eseguire il comando "" per trasformarlo in PDF.

Il problema è che il codice che sto eseguendo lascia il file nella stessa directory e voglio spostarlo ma preservare la struttura dell'albero dei file.

Quello che ho provato finora è:

find . -iname '*.jpg' -exec mogrify -format pdf '{}' \;

Questo comando funziona perfettamente. Voglio manipolare "{}" spostando una parte del suo contenuto;

{} = ./1/aa.xxx

e voglio convertirlo in:

{} = ./new/1/aa.pdf

grazie a @ mpez0 posso du di piccole modifiche e ottenere una soluzione:

find . -iname '*.jpg' | while read file ; do 
oldfile=${file##*/};
olddir=${file/"$oldfile"/""};
pdfdir=${file/'./''./PDF'};
pdfdir=${pdfdir/"$oldfile"/""};
savedir=${file/'./''./OLD'};
savedir=${savedir/"$oldfile"/""};
newfile=${oldfile/.[Jj][Pp][Gg]/.pdf};
mogrify -format pdf "$file"; 
mkdir -p "$pdfdir";
mkdir -p "$savedir";
mv -- "$olddir$newfile" "$pdfdir$newfile"; 
mv -- "$olddir$oldfile" "$savedir$oldfile"; 
done

cosa fa questo codice:
find . -iname '*.jpg'trova tutti i file che terminano con jpg e JPG
while read file ; dose l'azione ottiene un file ani salva la rotta nella variabile file
oldfile=${file##*/};elimina il file pat e salva il nome del file nella variabile oldfile
olddir=${file/"$oldfile"/""};elimina il nome del file per salvare il pat in olddir
pdfdir=${file/'./''./PDF'};cambio ./ in ./pdf e salvare il nuovo pat in pdfdir
pdfdir=${pdfdir/"$oldfile"/""};estrarre il nome del file per salvare il pdf in pdfdir
savedir=${file/'./''./OLD'};cambio ./ in ./old e salvare il nuovo pat in savedir
savedir=${savedir/"$oldfile"/""};estrarre il nome del file per salvare il pdf pat in savedir
newfile=${oldfile/.[Jj][Pp][Gg]/.pdf};salvare il nome del nuovo file che verrà creato in newfile
mogrify -format pdf "$file";convertire il filein pdf
mkdir -p "$pdfdir";creare le directory del pat pdfdir
mkdir -p "$savedir";creare le directory del pat savedir
mv -- "$olddir$newfile" "$pdfdir$newfile";spostare il nuovo file pdf creare nella directory pdf mv -- "$olddir$oldfile" "$savedir$oldfile";sposta il vecchio file jpg nella vecchia directory e doneprocedi

Spero che questo possa aiutare gli altri


mogrify ha un flag -o per la posizione di output? semplificherebbe un po 'il codice. inoltre, quale sistema operativo stai usando? più specificamente, quale shell? Con find, possiamo assumere una shell Linux?
Rich Homolka,

Ricco, sto usando bash anche in mac come in linux, nessun mogrify non ce l'ho.
Alejandro O'Byrne,

@ AlejandroO'Byrne Per favore pubblica la soluzione come risposta invece di modificare il corpo della tua domanda (puoi rispondere alla tua domanda ). Anche tu puoi accettare la risposta , che ha funzionato per te.
αғsнιη,

Risposte:


2
find . -iname '*.jpg' | while read f ; do 
    new=`echo $f | sed -e 's/\.[Jj][Pp][Gg]$/.pdf/'`; 
    newd=`dirname $f`;
    newd="new/$newd" 
    mogrify -format pdf $f; 
    mv $new $newd; 
done

Naturalmente, consiglio di eseguire lo script facendo eco ai comandi mogrifye mv. Se mogrifyoffre un'opzione di output, utilizzare quella invece di mv. Potresti trovare più semplice fare una ricerca e fare tutte le mogrifytrasformazioni, quindi raccogliere i nuovi .pdf.


grazie con un po 'di cambiamento ottengo la soluzione dal tuo suggerimento. GRAZIE
Alejandro O'Byrne,

1

Se usi convertinvece di mogrify(parte della stessa suite), il tuo comando diventa:

find . -iname '*.jpg' -exec convert -format pdf '{}' new/'{}'.pdf \;

A differenza di mogrify, convertuse non crea un'estensione di file aggiornata, quindi otterrai .jpg.pdf(più maiuscole) come nuova estensione di file, ma è facile cambiarlo con rename:

find new -iname '*.jpg.pdf' -exec rename 's/\.[Jj][Pp][Gg]//' '{}' \;

In seguito puoi rimuovere i JPEG se non hai bisogno di tenerli (spero che non ti serva quel comando di spiegazione).


questo non funziona
Alejandro O'Byrne,

Cosa non funziona? Ho controllato entrambi i comandi con un singolo file in una directory temporanea. Forse la struttura della directory deve essere creata in anticipo, usando find . -type d -exec mkdir new/'{}' \;. Si noti che ciò creerà directory anche quando non è presente alcun file JPEG. Dovrebbe essere molto più complesso da tenere in considerazione per questo, ma dopo puoi sempre rimuovere le directory vuote find new/ -type d -exec rmdir '{}' \;.
AFH,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.