Comando “find” -exec substituindo string

0

Estou tentando encontrar arquivos JPG em uma árvore de pastas para executar o comando "" para transformá-lo em PDF.

O problema é que o código que estou executando deixa o arquivo no mesmo diretório e eu quero movê-lo, mas preservar a estrutura da árvore de arquivos.

O que eu tentei até agora é:

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

Este comando funciona perfeitamente. Eu quero manipular "{}" mudando uma parte do seu conteúdo;

{} = ./1/aa.xxx

e quero convertê-lo para:

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

graças a @ mpez0 eu posso fazer pequenas alterações e obter uma solução:

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

o que esse código faz é:
find . -iname '*.jpg' localizar todos os arquivos que terminam com jpg e JPG
while read file ; do se a ação receber um arquivo ani salvar a rota na variável file
oldfile=${file##*/}; retire o arquivo pat e salve o nome do arquivo na variável oldfile
olddir=${file/"$oldfile"/""}; retire o nome do arquivo para salvar o caminho em olddir
pdfdir=${file/'./''./PDF'}; change ./ para ./pdf e salve a nova identificação em pdfdir e pdfdir=${pdfdir/"$oldfile"/""}; retire o nome do arquivo para salvar a identificação do arquivo em pdfdir em savedir=${file/'./''./OLD'}; change ./ para ./old e salve a nova tarefa em savedir
savedir=${savedir/"$oldfile"/""}; retire o nome do arquivo para salvar o arquivo pdf em savedir
newfile=${oldfile/.[Jj][Pp][Gg]/.pdf}; salve o nome do novo arquivo que será criado em newfile
mogrify -format pdf "$file"; converte o file para pdf
mkdir -p "$pdfdir"; cria os diretórios do pat pdfdir
mkdir -p "$savedir"; cria os diretórios do pat savedir
mv -- "$olddir$newfile" "$pdfdir$newfile"; move o novo arquivo pdf cria para o diretório pdf mv -- "$olddir$oldfile" "$savedir$oldfile"; move o antigo arquivo jpg para o antigo diretorie done termina o processo

Espero que isso ajude os outros

    
por Alejandro O'Byrne 19.12.2014 / 22:27

2 respostas

1

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

É claro que recomendo executar o script que ecoa os comandos mogrify e mv . Se mogrify oferecer uma opção de saída, use isso em vez do mv. Você pode achar mais simples fazer um achado e fazer todas as mogrify transformadas, depois coletar as novas .pdfs.

    
por 19.12.2014 / 22:43
1

Se você usa convert em vez de mogrify (parte do mesmo conjunto), seu comando se torna:

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

Ao contrário de mogrify , convert uses não cria uma extensão de arquivo atualizada, você receberá .jpg.pdf (mais capitalização) como a nova extensão de arquivo, mas isso é fácil de alterar com rename :

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

Você pode remover os JPEGs depois, se não precisar mantê-los (espero que você não precise esse comando soletrando).

    
por 19.12.2014 / 23:57