Onde você usa:
sed -i 's C:\ /root/ g'
você está usando o s
command com um caractere de espaço separando as diferentes partes do comando, o que é incomum, mas completamente válido. Quando você precede seu caractere separador com uma barra invertida, ele não é tratado como um separador, mas como parte do argumento em si.
O problema que você tem aqui é que a barra invertida em C:\
está escapando do espaço no meio, então s
nunca encontra o fim da substituição (que agora é g
) e reclama que o comando está inacabado como você viu.
No mínimo, você precisa escapar da própria barra invertida com outra barra invertida:
sed -i 's C:\ /root/ g'
Isso funcionará, embora a substituição dos espaços por outro caractere possa ser mais clara.
Quanto ao uso de xargs
e subdiretórios - xargs
não é necessário aqui, e O find
pode fazer isso, incluindo o manuseio de arquivos em subdiretórios, por conta própria. Use:
find ../ \( -name "*.xml" -o -name "*.conf" \) -exec sed -i -e 's|C:\|/root/|g' '{}' +
para ter find
executando o comando sed
com todos os nomes de arquivos encontrados. Os nomes dos arquivos são inseridos no lugar de {}
e +
significa find
minimizará o número de vezes que ele executa o comando.
-execdir
pode ser melhor que -exec
por certos motivos de segurança descritos na find
man page ; é uma extensão não padrão, mas como você parece estar usando ferramentas GNU, ela deve estar lá para você, se você precisar.