Não analise a saída de find
dessa maneira. Ele funcionará se seus arquivos não contiverem caracteres especiais, mas para invocar um comando nos arquivos encontrados por find
, é mais fácil e mais robusto fazer com que find
chame o comando:
find "$new_directory" -name '*.css' -o -name '*.js' -exec grep … {} +
Então grep
não é a ferramenta certa para realizar uma substituição de texto; é apenas uma ferramenta de pesquisa. sed
é um editor de fluxo e seu recurso mais usado é a substituição de expressões regulares. Assumindo que o GNU sed (como encontrado no Linux), e supondo que o seu regexp é basicamente correto, ou seja, que você deseja corresponder todas as seqüências de letra-ou-dígito-ou-co_de% seguido por uma extensão provável como nomes de arquivo , eis uma chamada :._-
para substituir sed
por DIR1/DIR2/FILE.EXT
em todos os lugares:
sed -e 's![/A-Za-z0-9:._-]*/\([A-Za-z0-9:._-]*\.\(png\|jpg\|gif\|tif\|css\)\)!!g'
Colocando as duas partes juntas, se você quiser fazer as substituições no lugar, a maneira mais fácil é usar a opção FILE.EXT
do GNU sed, que faz exatamente isso.
find "$directory" -name '*.css' -o -name '*.js' \
-exec sed -e 's![/A-Za-z0-9:._-]*/\([A-Za-z0-9:._-]*\.\(png\|jpg\|gif\|tif\|css\)\)!!g' {} +
Se você quiser colocar as substituições em um lugar diferente, você precisará de um pouco de cola intermediária para construir os nomes dos novos arquivos.
find "$old_directory" -name '*.css' -o -name '*.js' \
-exec sh -c 'sed -e '\''s![/A-Za-z0-9:._-]*/\([A-Za-z0-9:._-]*\.\(png\|jpg\|gif\|tif\|css\)\)!!g'\' <"$0" >"/new/directory/$0"' {} \;
Observe o uso de -i
para colocar uma aspa simples dentro do fragmento de shell de aspas simples. '\''
significa executar o comando uma vez em cada arquivo, em contraste com -exec … {} \;
, que executa o comando em tantos arquivos em um lote quanto possível.