Muitas grep
variants implementam uma opção recursiva.
Por exemplo, GNU grep
-R, -r, --recursive
Read all files under each directory, recursively; this is equivalent to the -d recurse option.
Você pode então remover find
:
grep -n -r $pattern $path | awk '{ print $1 }'
mas isso mantém mais do que o número da linha. awk
está imprimindo a primeira coluna. Este exemplo
src/main/package/A.java:3:import java.util.Map;
src/main/package/A.java:5:import javax.security.auth.Subject;
src/main/package/A.java:6:import javax.security.auth.callback.CallbackHandler;
será impresso como
src/main/package/A.java:3:import
src/main/package/A.java:5:import
src/main/package/A.java:6:import
observe o :import
em cada linha. Você pode querer usar sed
para filtrar a saída.
Como um :
pode estar presente no nome do arquivo, você pode usar a opção -Z
do grep para gerar um caractere nulo (\ 0) após o nome do arquivo.
grep -rZn $pattern $path | sed -e "s/[[:cntrl:]]\([0-9][0-9]*\).*/:/"
com o mesmo exemplo de antes produzirá
src/main/package/A.java:3
src/main/package/A.java:5
src/main/package/A.java:6