Eu usaria 1 find
com duas -exec
actions, por exemplo:
find . -type f -exec grep -qF SOME_STRING {} \; -exec sed 'COMMAND' {} \;
O segundo comando será executado somente se o primeiro for avaliado como verdadeiro , ou seja, código de saída 0
, então sed
processará o arquivo em questão somente se o arquivo contém SOME_STRING . É fácil ver como funciona:
find . -type f -exec grep -qF SOME_STRING {} \; -print
ele deve listar apenas os arquivos que contêm SOME_STRING . Claro, você sempre pode encadear mais de duas expressões e também usar operadores como !
(negação), por exemplo:
find . -type f -exec grep -qF THIS {} \; ! -exec grep -qF THAT {} \; -print
listará apenas os arquivos que contêm THIS , mas não contêm THAT .
De qualquer forma, no seu caso:
gfind /tmp/ -type f \( -name "*.h" -o -name "*.cpp" \) \
-exec ggrep -qF LARGE_INTEGER {} \; \
-exec gsed -i '1s/^/#include <stdint.h>\n/' {} \;
1
Eu suponho que sua xargs
não suporta a opção -0
ou --null
. Em caso afirmativo, use a seguinte construção:
find . -type f -exec grep -lFZ SOME_STRING {} + | xargs -0 gsed -s -i 'COMMAND'
i.e. no seu caso:
gfind /tmp/ -type f \( -name "*.h" -o -name "*.cpp" \) \
-exec ggrep -lFZ LARGE_INTEGER {} + | \
xargs -0 gsed -s -i '1s/^/#include <stdint.h>\n/'
Deve ser mais eficiente que o primeiro.
Além disso, ambos funcionarão com todos os tipos de nomes de arquivos. Note que estou usando grep
com -F
(string fixa), pois é mais rápido, então remova-o se você estiver planejando usar um regex.