
Estou tentando procurar um arquivo chamadoLivro1.
No meu teste estou tentando procurar o arquivo citado e neste teste não sei onde esse arquivo está localizado.
Eu tentei find / -iname book1
, mas não há saída.
Como encontro meu arquivo chamado book1 usando a linha de comando se não sei onde o arquivo está localizado?
EDITAR:
Meu cenário é descrito com mais detalhes abaixo:
- A extensão do arquivo é desconhecida
- O nome exato (ou seja, letras maiúsculas, números, etc.) é desconhecido
- A localização do arquivo é desconhecida
Responder1
Primeiro, um argumento para -iname
é um shellpadrão. Você pode ler mais sobre padrões emManual do Bash. A essência é que, para find
realmenteencontrarum arquivo, o nome do arquivo deve corresponder ao padrão especificado. Para fazer uma book1
correspondência de string sem distinção entre maiúsculas e minúsculas Book1.gnumeric
, você deve adicionar *
para que fique assim:
find / -iname 'book1*'
ou especifique o nome completo:
find / -iname 'Book1.gnumeric'
Em segundo lugar, -iname
fará com que find
ignore o caso do nome do arquivo, portanto, se você especificá-lo, -iname book1
também poderá encontrar Book1
, bOok1
etc. Se tiver certeza de que o arquivo que está procurando é chamado, Book1.gnumeric
não use -iname
mas -name
, será mais rápido:
find / -name 'Book1.gnumeric'
Terceiro, lembre-se de citar o padrão conforme dito nooutra resposta.
E por último - você tem certeza de que deseja procurar o arquivo
em todos os lugaresno seu sistema? É possível que o arquivo que você está procurando esteja realmente em seu $HOME
diretório se você trabalhou nele ou baixou-o de algum lugar. Novamente, isso pode ser muito mais rápido.
EDITAR:
Percebi que você editou sua pergunta. Se você não sabe o nome completo do arquivo, letras maiúsculas e localização, você deve usar algo assim:
find / -iname 'book1*'
Sugiro também colocar 2>/dev/null
no final da linha para ocultar todos *permission denied*
e outros erros que estarão presentes se você invocar find
como usuário não root:
find / -iname 'book1*' 2>/dev/null
E se você tiver certeza de que está procurando por um único arquivo e houver apenas um único arquivo em seu sistema que corresponda aos critérios, você pode dizer find
para sair depois de encontrar o primeiro arquivo correspondente:
find / -iname 'book1*' -print -quit 2>/dev/null
Responder2
Você pode tentar o locate
comando. Ele usa um banco de dados de nomes de arquivos para tornar a pesquisa mais rápida.
Para pesquisar todas as correspondências de arquivos *book1*
e ignorar maiúsculas e minúsculas, você pode usar
locate -i book1
se você quiser procurar arquivosiniciandocom book1
você precisará fazer o curinga você mesmo:
locate -i 'book1*'
É muito mais rápido que o find
, mas está tão atualizado quanto a última vez que o banco de dados foi atualizado.
Responder3
Se você sabe que tem um arquivo chamado book1.something
, onde a localização do arquivo, o valor exato de something
e o padrão de letras maiúsculas do nome do arquivo são todos desconhecidos:
find / -iname 'book1.*'
Se tudo o que você sabe com certeza é que o nome do arquivo contém a palavra book
, você pode gerar uma lista provavelmente muito maior com
find / -iname '*book*'
O argumento para -name
é um padrão shell glob. No diretório em que o arquivo está, compare:
$ ls Book1
ls: cannot access 'Book1': No such file or directory
$ ls Book1.*
Book1.gnumeric
Isso representa o tipo de pesquisa realizada por -name
. A -iname
opção simplesmente permite uma versão que não diferencia maiúsculas de minúsculas.
Responder4
Com Zsh você pode usar padrões glob, então isso também funciona:
ls -a /**/book1
Isso encontrará todos os locais onde book1
reside um arquivo chamado.
Nos meus testes, isso parece ser mais rápido que usar find
e também produz pouco ou nenhumerros de permissão do usuárioquando executado sem permissão de root
Vermanual.