Com o Busybox, como você pesquisa uma expressão em vários arquivos recursivamente em vários diretórios, mas apenas procura em arquivos de texto?
Não sabemos qual será o sufixo do arquivo; poderia ser .sh, poderia ser nada, poderia ser outra coisa. Eu estava pensando em basear a pesquisa na codificação, embora também não tenha certeza de qual seria a codificação.
Eu tentei busybox grep -r
, mas ele também pesquisa arquivos binários, o que desperdiça muito tempo.
Responder1
grep
suporta a opção --binary-files
de tratar arquivos binários como binary
, text
ou without-match
. A última opção deve pular os arquivos binários. É equivalente a grep -I
. Fiz um teste e parece que o Busybox grep
suporta -I
pular arquivos binários.
grep
não é "mágico" para determinar se um arquivo é binário ou texto: ele simplesmente verifica os primeiros bytes para ver se eles parecem ser texto ou não e assume o mesmo para o restante do arquivo (de acordo com man grep
).
Notas laterais: pode-se emular isso, por exemplo, comparando se head -1 myfile
de um arquivo é igual a head -1 myfile | strings
. Se file
estiver disponível, é ainda mais confiável, mas não está no Busybox e provavelmente não está no sistema se o Busybox for usado principalmente.
Responder2
Qual é a diferença entre um arquivo binário com a estrutura
struct MyBin
{
byte a;
byte b;
byte c;
}
com os valores
myBin.a = 70;
myBin.b = 111;
myBin.c = 111;
E um arquivo de texto com o texto Foo
?
Tudo o que um arquivo de texto é é um arquivo binário que você interpreta usando códigos de pesquisa especiais chamados codificações de caracteres (ASCII, UTF-8, ect...). Portanto, não há uma maneira fácil de diferenciar "Arquivos Binários" de "Arquivos de Texto".
Pode haver uma maneira de excluir arquivos que tenham o bit de execução definido ou apenas pesquisar arquivos com tamanho de arquivo (duvido que seu arquivo de texto tenha mais de 1 MB), mas não tenho conhecimento suficiente sobre como filtrar os resultados do grep para dê um exemplo de como fazer.