Oh, querida, você é uma vítima da coisa mais terrível do mundo: você procurou na Internet para encontrar trechos de scripts de shell, você encontrou muitos deles, mas nunca lhe disseram que a maioria deles é completamente quebrado. A maioria deles quebra se encontrar nomes de arquivos com espaços neles.
Este é tipicamente o caso de todos os scripts que analisam a saída de um comando designado para produzir informações legíveis por seres humanos, por exemplo, find
ou ls
.
No seu caso, você tem o arquivo /tmp/tmp.Q18p8BRYcc/steam engine.txt
que contém um espaço e que quebra seu comando.
Por favor, considere o uso de find
corretamente , com sua opção -exec
:
find "$tmp" -type f -exec sed -i "s/${targetsubstring}/${newsubstring}/g" {} \;
Nesse caso, find
irá -exec
ute a parte
sed -i "s/${targetsubstring}/${newsubstring}/g" {}
com o marcador de posição {}
substituído pelos nomes de arquivos encontrados ... mas substituído corretamente de uma maneira que não possa ser encontrado se o nome do arquivo contiver espaços, novas linhas ou outros símbolos engraçados. Bem, ele pode quebrar se {}
for substituído por algo que comece com um hífen (mas isso é improvável, a menos que a variável $tmp
se expanda para tal coisa); neste caso,
sed -i "s/${targetsubstring}/${newsubstring}/g" -- {}
fará, se sua versão sed
suportar a opção --
, é claro.
Você pode substituir o \;
(que significa fim dos argumentos de comando a executar ) por +
, de forma que sed
seja lançado com tantos argumentos que ele possa manipular, então não será gerado uma vez por arquivo.
Ainda, há outra maneira de usar find
com segurança com xargs
, usando a opção -print0
de find
e a opção -0
de xargs
:
find "$tmp" -type f -print0 | xargs -0 sed -i "s/${targetsubstring}/${newsubstring}/g"