Resumindo, consegui uma pasta com quase 800.000 arquivos php. Gostaria de procurar uma string em cada arquivo e, se existir nesse arquivo, o arquivo será copiado para outro diretório.
Isso é possível a partir do terminal?
Até agora eu consegui:
grep -i -n -r 'ppr-1792' * | cp $1 move_to_here
Mas isso obviamente não funciona. $1 precisa ser o nome do arquivo que contém o texto correspondente.
O que devo fazer?
Responder1
Você pode usar um loop for e testar o código de retorno do grep ou usar grep -c
(contar correspondências) e ver se a contagem de correspondências é maior que 1.
por exemplo
for i in *
do
grep -i -n 'Power' "$i"
if [ "$?" -eq 0 ]
then
cp "$i" mvd
fi
done
Responder2
Você pode fazer isso facilmente com um belo forro:
grep -l -i -r -Z pattern | xargs -0 -I source cp source /target
Alguns comentários sobre como funciona. A opção -l do Grep imprime apenas um nome de arquivo se houver uma correspondência no arquivo, produzindo uma lista de arquivos a serem copiados. O comando Xargs constrói um comando para cada comando de cópia e o executa. Xargs substitui o argumento denominado "fonte" por um nome de arquivo lido na entrada padrão. Espaços e outros caracteres engraçados em nomes de arquivos são tratados com as opções -Z e -0.