Renomeia todos os espaços em nomes de arquivos de imagem dentro de arquivos html php

1

Dentro de diferentes arquivos web htm.gz, html.gz e php.gz eu tenho imagens e as do formato .jpg têm nome com espaço ao invés de "-", mas no diretório / images / onde todas as imagens estão localizadas elas tem "-" em vez de espaço

No arquivo html eu tenho " <img class="photo" width="400" height="600" src="/images/red roses in summer 54.jpg" alt="">

E no diretório "/ images /" todos são listados com "-" entre palavras como "red-roses-in-summer-54.jpg"

Então, o que eu quero é um comando / script bash que pesquise todos os arquivos htm.gz, html.gz e php.gz dentro de /var/www/domain.com e encontre todas as imagens .jpg e substitua o espaço por " - ". Então, de / images / red roses no verão 54.jpg para ter /images/red-roses-in-summer-54.jpg

O servidor está sendo executado no centos 7 se for importante.

    
por becoolflyer 08.06.2016 / 16:55

2 respostas

0

O ideal é que isso seja feito em uma linguagem como perl ou python , que tem boas bibliotecas de análise de HTML. Mas se você quiser fazer isso em um shell script, você pode instalar o pacote xml2 , que fornece ferramentas chamadas html2 e 2html para converter HTML para e de um formato de arquivo simples adequado para uso com ferramentas orientadas a linha como sed , grep , awk , etc.

Ele também contém ferramentas semelhantes para trabalhar com arquivos XML e CSV.

Em seguida, você pode usar sed para transformar espaços correspondentes a img src lines em traços. Em seguida, converta de volta para html.

Por exemplo, usando sua linha HTML de amostra:

$ cat file.html 
<img class="photo" width="400" height="600" src="/images/red roses in summer 54.jpg" alt="">

$ html2 < file.html  | sed -e '\:/img/@src=/images/: s/ /-/g' | 2html 
<html><body><img class="photo" width="400" height="600" src="/images/red-roses-in-summer-54.jpg" alt="">

Redirecione a saída dessa para, por exemplo, file.new.html . e, em seguida, mv -f file.new.html file.html se você quiser substituir o arquivo original pela versão modificada. Eu recomendo strongmente manter uma cópia de backup dos arquivos originais para que você possa reverter para um bom ponto de partida se cometer um erro.

BTW, o formato de arquivo simples produzido por html2 é assim:

$ html2 < file.html 
/html/body/img/@class=photo
/html/body/img/@width=400
/html/body/img/@height=600
/html/body/img/@src=/images/red roses in summer 54.jpg
/html/body/img/@alt

xml2 é empacotado para o Debian e Ubuntu e provavelmente outras distribuições do Linux. Se não estiver disponível pré-empacotado para seu unix, você pode encontrar o código-fonte no link acima.

Existem muitas maneiras de fazer essas alterações em vários arquivos. Aqui está um exemplo simples de for loop.

for htmlfile in *.html ; do

   html2 < "$htmlfile" |
       sed -e '\:/img/@src=/images/: s/ /-/g' |
       2html > "$htmlfile.new" \
   && mv -f "$htmlfile.new" "$htmlfile"

done

AVISO: teste que isso faz o que você espera antes de executá-lo em vários arquivos HTML. E mantenha um backup dos originais. Se o HTML em seus arquivos não for HTML completamente válido (ou seja, se ele não passar em um verificador de sintaxe HTML), então html2 | ... | 2html poderá tornar seus arquivos html ainda mais quebrados do que eles já são.

Se houver muitos arquivos ou os arquivos estiverem em vários subdiretórios, você precisará usar find ... -exec . Existem inúmeros exemplos de uso de find neste site.

    
por 09.06.2016 / 06:35
0

Encontrei algo, mas não funciona bem:

find /var/www/domain.com -type f ! \( -name '*.db' -o -name '*.sqlite' -o -name '*.feed' -o -name '*.com' -o -name '*.xml' -o -name '*.gz' -o -name '*.txt' -o -name '*.pdf' -o -name '*.js' -o -name '*.css' -o -name '*.ico' -o -name '*.gif' -o -name '*.png' -o -name '*.jpg' -o -name '*.jpeg' \) -maxdepth 1 -exec sed -e '\:/img/@src=/images/: s/ /-/g' {} \;

Isso abre todos os arquivos, olha dentro, mas não muda nada. Alguma sugestão?

    
por 09.06.2016 / 12:40