
Tenho um grande conjunto de arquivos nos quais preciso substituir um esquema de URL completo. Alguns nomes de arquivos contêm espaços. Depois de muita pesquisa, rial e erro, este é o mais próximo que cheguei:
find /somedir -type f -print0 -exec sed -i'' -e 's#http\\:\\/\\/domain.com#https\\:\\/\\/www.domain.com#g' {} +
O arquivo resultante tem o esquema http:
removido, deixando o //
- ou seja, '//www.domain.com'
Além disso, um NOVO arquivo é criado, anexado -e
ao nome do arquivo. - ou seja some file.php-e
, que obviamente indesejado.
Embora isso certamente seja suficiente (depois de remover os *-e
arquivos, o TOC em mim realmente quer saber como fazer isso corretamente. Nota: estou trabalhando localmente em um Mac, mas também farei isso no Linux.
Qualquer ideia é muito apreciada!
Responder1
Solução 1: Uma maneira é usar find
com xargs
:
find /dir -type f -print0 | xargs -0 sed -i 's#http://domain.com#https://www.domain.com#g'
Solução 2: Outra seria usar find
with -exec
, bem parecido com a sua pergunta:
find /dir -type f -exec sed -i 's#http://domain.com#https://www.domain.com#g' {} +
Ambas as soluções chamarão sed
vários arquivos como argumentos. Portanto, sed
não é chamado uma vez para cada arquivo, mas para cada conjunto de arquivos.
Solução 3: Em vez de sed
, você também pode usar perl
para search-replace-job:
perl -i -pe 's#http://domain.com#https://www.domain.com#g' file
Combinado com o comando find
/ xargs
:
find /dir -type f -print0 | xargs -0 perl -i -pe 's#http://domain.com#https://www.domain.com#g'