Executei o seguinte para substituir um termo usado em todos os arquivos no diretório de trabalho atual:
$ find . -type f -print0 | xargs -0 sed -i'.bup' -e's/Ms. Johnson/Mrs. Melbin/g'
Isso executou a substituição da palavra, mas também criou .bup
arquivos de arquivos que nunca tiveram a Ms. Johnson
string.
Como faço a substituição sem criar todos esses backups desnecessários?
linux
shell-script
scripting
sed
Belmin Fernandez
fonte
fonte
ex
e executar condicionalmente (apenas se o arquivo for alterado):!cp '%' '%.bup'
antes de salvar e sair. Pode valer a pena procurar dentro.vi
troca de pilhas.Respostas:
Você pode verificar o conteúdo dos arquivos para garantir que uma substituição ocorra ao
sed
operar com eles:Se você quer ser realmente esperto, pode deixar de usar
find
:fonte
'{}'
pouco antes de você\;
nisso-exec
.O Find possui um
-exec
operador que executa um comando arbitrário. Ainda melhor,-exec
é um teste , para que você possa encadear vários-exec
s juntos e, se comandos anteriores falharem, outros não serão executados. A sequência{}
é substituída pelo nome do arquivo atual e;
marca o final do comando. Você deve citar os dois para evitar que o shell interfira.Então:
fonte
{}
para a cadeia nula ao fazer a expansão entre chaves.Olhei para a página de manual e não vi nenhuma maneira de fazê-lo diretamente
sed
, como tenho certeza que você viu antes de perguntar. Vejo várias maneiras de contornar isso usando o grep, mas acho que o mais fácil é o seguinte:-r
recursivo-l
imprimir nome de arquivo apenas-Z
nomes finais com nulofonte
Parece que você precisa criar uma lista de arquivos que correspondam aos seus termos de pesquisa primeiro.
fonte
.
argumento como o primeirofind
. Além disso, como fui informado há não muito tempo, você não precisa realmente citar ou escapar do{}
find
gera uma lista de arquivos separados por nova linha, depois o shell divide essa lista em qualquer espaço em branco (não apenas nas novas linhas) e, em seguida, o shell trata cada palavra como um padrão global. Isso funciona apenas se os nomes dos arquivos não contiverem espaços em branco ou\[?*
. Outras respostas nesta página mostram como fazer isso corretamente..
é desnecessário com o find (pelo menos, encontrado no linux) porque é assumido quando nenhum caminho é passado em um argumento.