Supondo que a ferramenta grep deva ser usada, gostaria de procurar a sequência de texto "800x600" em todo o sistema de arquivos.
Eu tentei:
grep -r 800x600 /
mas não funciona.
O que eu acredito que meu comando deve fazer é grep recursivamente através de todos os arquivos / pastas raiz para o texto "800x600" e listar os resultados da pesquisa.
O que estou fazendo errado?
Permission denied
erros? Você o executou como root ou como usuário normal?grep -r 800x600 / 2>/dev/null
. Você também pode tentar executá-lo como root.Respostas:
Normalmente, eu uso esse estilo de comando para executar
grep
vários arquivos:O que isso realmente faz é fazer uma lista de todos os arquivos no sistema e, em seguida, para cada arquivo, executar
grep
com os argumentos fornecidos e o nome de cada arquivo.O
-xdev
argumento diz que ele deve ignorar outros sistemas de arquivos - isso é bom para evitar sistemas de arquivos especiais, como/proc
. No entanto, ele também ignorará também os sistemas de arquivos normais - portanto, se, por exemplo, sua pasta / home estiver em uma partição diferente, ela não será pesquisada - você precisaria dizerfind / /home -xdev ...
.-type f
significa procurar apenas arquivos, para que diretórios, dispositivos e outros arquivos especiais sejam ignorados (ele ainda será executado novamente nos diretórios e será executadogrep
nos arquivos contidos - apenas não será executadogrep
no próprio diretório, o que não funcionaria de qualquer maneira). E a-H
opção paragrep
diz para sempre imprimir o nome do arquivo em sua saída.find
aceita todos os tipos de opções para filtrar a lista de arquivos. Por exemplo,-name '*.txt'
processa apenas arquivos que terminam em .txt.-size -2M
significa arquivos menores que 2 megabytes.-mtime -5
significa arquivos modificados nos últimos cinco dias. Junte-os a -a for e -o for or e use'('
parênteses')'
para agrupar expressões (entre aspas para impedir que o shell as interprete). Então, por exemplo:Dê uma olhada
man find
para ver a lista completa de possíveis filtros.fonte
-xdev
excluirá todos os outros sistemas de arquivos, não apenas os especiais. (por exemplo, se tiver/home
montado como uma partição separada, não vai ser pesquisado.)find: paths must precede expression: /
xargs
com talvez melhor eficiência fazendo issofind / -xdev -type f -exec grep -H '800x600' +
.+
sinal no final dofind
comando realmente faz o mesmoxargs
: gera umgrep
processo com vários argumentos.Normalmente você não gostaria de pesquisar TUDO no sistema. O Linux usa nós de arquivo para tudo, então alguns "arquivos" não são coisas que você deseja pesquisar. Por exemplo,
/dev/sda
é o dispositivo de bloco físico para o seu primeiro disco rígido. Você provavelmente deseja pesquisar os sistemas de arquivos montados, não o dispositivo de disco bruto. Também existe o/dev/random
que cospe dados aleatórios toda vez que você os lê. Pesquisa que não faz muito sentido. O/proc
sistema de arquivos também é problemático no seu caso.Eu recomendaria uma de duas coisas.
Não pesquise na raiz, pesquise apenas os locais que podem ser úteis. Pesquise
/home
ou/usr
ou/etc
separadamente. As informações que você está procurando provavelmente são de um tipo específico, portanto, provavelmente estarão em uma pasta específica. As definições de configuração deve estar em/etc
. Seus arquivos de dados pessoais deve ser em/home
. Limitar a pesquisa a uma área importante como essa reduzirá bastante os problemas com greps recursivos.Exclua o uso de áreas problemáticas
--exclude-dir
e um conjunto de coisas que você sabe que não precisa:grep -r --exclude-dir /proc --exclude-dir /dev --exclude-dir /tmp --exclude-dir /lost+found
Por fim, não é incomum encontrar alguns erros de 'permissão negada' ao executar um grande grep recursivo. No curso normal de uso, existem arquivos que seu usuário pode não conseguir ler. Contanto que sejam apenas alguns arquivos estranhos e não coisas como o dispositivo bruto para seus discos rígidos ou todo o sistema de arquivos proc, não há problema em ignorar os erros. Na verdade, você pode fazer isso na linha de comando enviando todos os erros para a terra nunca:
fonte
-I
excluir binárioPara simplificar, eu sugeriria o ack-grep . O link mostra muitos casos quando
ack-grep
é uma opção melhor.Para usar é, após a instalação:
fonte
Outra maneira de ver é desta maneira:
fonte
* então recebo um / proc / sysrq-trigger: erro de entrada / saída
Seu comando está funcionando. Você está recebendo este erro porque está tentando verificar os processos em execução em busca de uma sequência.
Eu recomendo excluir diretórios do sistema com
grep -exclude-dir = {proc, sys} "800x600" /
fonte
simplesmente
-O que está errado no seu comando atual são as aspas, "". Sempre coloque o argumento da string
grep
entre aspas.fonte
grep
. Experimente e você verá. Coloque a string "800x600" em um arquivogrep 800x600 file
e você verá que ela funciona muito bem. Obviamente, o OP está tendo outro problema.