Linux grep ou encontrar uso

4

Como faço para encontrar um arquivo no meu disco rígido que comece com io_file ?

Eu tentei:

grep -r io_file*' 

e

find -name io_file*

find não retornou nada, enquanto grep parece demorar sem resultados.

O que estou fazendo de errado?

    
por Peter Mortensen 11.08.2009 / 21:41

8 respostas

11

find / -name 'io_file*'

O primeiro parâmetro irá especificar onde a pesquisa deve começar. / significa todo o seu disco rígido. Para pesquisar apenas no diretório atual (e subdiretórios), use: find .

A cadeia de pesquisa deve ser citada se contiver um metacaractere de shell, como um asterisco. Caso contrário, ele será analisado pelo shell e nunca será visto por find .

    
por 11.08.2009 / 21:43
7
find / -name 'io_file*' -type f 2>/dev/null



   /: Start looking from root directory

   -type f: Only search for regular files

    2>/dev/null: Redirect errors to /dev/null. (handy if you are not root and
                 not interested in all the "access denied" messages)

Tenha em mente que grep e find fazem coisas diferentes.

grep searches the named input FILEs (or standard input if no files are named, or the file name - is given) for lines containing a match to the given PATTERN. By default, grep prints the matching lines.

find - search for files in a directory hierarchy

    
por 11.08.2009 / 21:43
4

O IMO, usando o find, é lento para uma pesquisa inteira no disco rígido (ele também mostrará muitos erros de permissão ao acessar arquivos que você não possui). Se possível, use locate:

locate -b 'io_file*'

Você provavelmente terá que indexar novamente se o arquivo for mais recente que 24 horas (normalmente, ele define um cronjob diário):

sudo updatedb
    
por 11.08.2009 / 21:46
2
find / -name 'io_file*'
    
por 11.08.2009 / 21:43
2

O comando

# set -x

imprimirá comandos após a expansão do shell para que você possa ver o que está acontecendo

# find . -name letter.*
+ find . -name letter.rtf

... e agora você pode ver que o shell está expandindo o argumento para nomear em letter.rtf , pois meu atual driectory contém um arquivo chamado letter.rtf que corresponde ao padrão.

Citando o padrão (aspas duplas funcionam neste caso também) interromperão a expansão do shell

# find . -name 'letter.*'
+ find . -name 'letter.*'

Para desativá-lo, use

# set +x

Você também pode usar -x em uma linha shebang para ver o que os scripts de shell estão fazendo pode ajudar bastante na depuração.

#!/bin/bash -x
    
por 11.08.2009 / 22:45
0

O shell expande os curingas e transmite o resultado para o grep, portanto, é necessário fugir do * ou usar aspas:

find / -name io_file\*
find / -name 'io_file*'
find / -name "io_file*"

Todos os três fazem a mesma coisa na minha caixa Linux.

    
por 11.08.2009 / 21:46
0

find -name io_file* pesquisará no diretório atual e somente abaixo. Se você quiser pesquisar todo o disco rígido, precisará especificar o caminho: find / -name io_file* . A mesma coisa acontece com grep -r ; ele só pesquisará no diretório atual e abaixo.

O utilitário find é muito útil, mas pode ser um pouco contra-intuitivo de usar. Minha recomendação é que você leia a página de manual de busca ( man find ), vale a pena o tempo investido.

    
por 11.08.2009 / 21:47
0

Como você não deu um arquivo grep , ele está operando na entrada padrão e esperando que você digite algo. É o comando errado de qualquer maneira. Quanto a encontrar você precisa de um diretório para começar e ter que colocar io_file* entre aspas, caso contrário ele será expandido pelo shell:

find / -name "io_file*"

Você também pode usar locate "io_file*" , que é mais rápido, mas pode ser impreciso.

    
por 11.08.2009 / 21:48

Tags