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.