Se você está recebendo erros sobre as permissões (você não diz que sim), então eu acho que você está no diretório raiz ( /
) ou em algum caminho onde você não tem permissão para ler todos os arquivos, como /etc
ou /var
. Mas desde que você diz que leva muito tempo, estou inclinado mais para a primeira suposição (o diretório raiz).
Se você quiser pesquisar absolutamente todos arquivos no sistema todo , o que você está fazendo está correto. vai demorar muito tempo, não importa o que você faça. É apenas um monte de arquivos para pesquisar.
Você pode usar find
para diminuir a quantidade de arquivos a serem examinados.
No momento, você tem
$ find . -name "*.txt" | xargs grep texthere
Como parece que você está interessado apenas em arquivos de texto simples, podemos excluir qualquer outro tipo de arquivo (executáveis):
$ find / -type f \! -perm -o=x -name "*.txt" | xargs grep texthere
Substitui .
por /
aqui, porque é aí que penso que você está (corrija-me se estiver errado). Eu também estou especificando que eu quero arquivos ( -type f
) que são não executáveis ( \! -perm -o=x
) (o !
precisa ser escapado para que seu shell não faz coisas engraçadas com isso).
Agora, há mais algumas coisas que podemos fazer. Uma é uma questão de segurança, e a outra pode melhorar a velocidade um pouquinho.
Alguns nomes de arquivos podem ter espaços ou outros caracteres que normalmente não queremos em nomes de arquivos. Para poder transmiti-los corretamente entre find
e grep
, fazemos
$ find / -type f \! -perm -o=x -name "*.txt" -print0 | xargs -0 grep texthere
Isso ( -print0
) significa que cada nome de arquivo será delimitado por um caractere nul
( xargs
) em vez de um caractere de espaço. E a opção correspondente a nul
para receber esses nomes como -0
-delimited é fgrep
.
É porque você não está usando as duas opções que acredito ter recebido os erros "não há arquivo ou diretório".
A velocidade é grep -F
. Este é um utilitário que é exatamente equivalente a find
que você deve usar se sua string de pesquisa for uma string de texto simples sem expressões regulares.
Portanto, se você tiver uma string de texto simples e quiser procurá-la em todos os arquivos do sistema:
$ find / -type f \! -perm -o=x -name "*.txt" -print0 | xargs -0 fgrep texthere
A coisa da permissão ... Obviamente, haverá arquivos que você não poderá ler. Você pode executar fgrep
e sudo
com -perm
pré-anexados a eles:
$ sudo find ... | xargs -0 sudo fgrep texthere
Ou você poderia tentar criar outro find
flag para sudo -s
(e também ignorar diretórios que você não pode inserir), mas isso consumiria muito tempo e resultaria em uma linha de comando ridiculamente longa, então eu não farei isso aqui.
Ou você poderia apenas root
obter um shell de root e executar a coisa de lá ... mas eu geralmente aconselharia contra isso porque as pessoas têm uma tendência a bagunçar seus sistemas esquecendo que são locate
.
OUTRA SOLUÇÃO seria usar o comando .txt
para localizar todos os arquivos locate
em todo o sistema. O comando find
não pesquisa a hierarquia de arquivos, mas usa um banco de dados (que geralmente é atualizado diariamente, portanto, nem todos os arquivos podem estar lá). O banco de dados contém apenas arquivos em diretórios acessíveis por todos os usuários, portanto, se você removeu as permissões de leitura em seus próprios diretórios, seus arquivos não estarão lá.
Então, substituindo o comando locate
acima pelo -0
quase-equivalente:
$ locate '*.txt' -0 | xargs -0 fgrep texthere
A opção --null
(ou --print0
em alguns sistemas) corresponde à opção find
de %code% .