Há quase 10 anos, fiz esta pergunta
usar SED recursivamente no linux?
e obtive este comando útilfind . -type f -print0 | xargs -0 sed -i 's/regex_search_term/replace_term/g'
Decidi aprender mais sobre a declaração find
, xargs
e sed
. No Ubuntu 18.04 na versão bash 4.4.20(1)-release, posso simplificar a declaração para isso:
find . -type f -print | xargs sed -i 's/regex_search_term/replace_term/g'
Que pode então ser simplificado novamente para isso:
find . -type f | xargs sed -i 's/regex_search_term/replace_term/g'
Então, minha pergunta é: existem desvantagens em não usar a -print0
bandeira com a -0
bandeira de find
e xargs
respectivamente? E há alguma desvantagem em abandonar a -print
bandeira completamente? Eles são usados explicitamente para compatibilidade com diferentes sistemas do tipo unix?
As versões que não usam
-print0
exargs -0
ficarão confusas com vários caracteres raros, mas legais em nomes de arquivos, incluindo espaços, tabulações, novas linhas, aspas e barras invertidas. Um byte zero (o caractere ASCII NUL) é a única coisa que não pode ocorrer em um caminho de arquivo, portanto, usá-lo como delimitador evita esses problemas potenciais.Mas na verdade existe uma maneira mais simples. As versões modernas de
find
têm um-exec ... +
primário que faz essencialmente a mesma coisa quexargs
, diretamente nofind
comando:Isso não tem todas as opções que
xargs
tem, então, se você precisar de algo diferente do usual collect-names-and-run-it, você ainda deve usar-print0 | xargs -0
.