Como encontrar um arquivo de qualquer diretório


22

Estou tentando procurar um arquivo chamado Book1 .

No meu teste, estou tentando procurar o arquivo mencionado acima e, nesse teste, não sei onde esse arquivo está localizado.

Eu tentei, find / -iname book1mas não há saída.

Como localizo meu arquivo chamado book1 usando a linha de comando se não sei onde o arquivo está localizado?

EDITAR:

Meu cenário é descrito em mais detalhes abaixo:

  1. A extensão do arquivo é desconhecida
  2. O nome exato (ou seja, letras maiúsculas, números etc.) é desconhecido
  3. O local do arquivo é desconhecido

2
Se houver um arquivo chamado Book1e ele estiver em um diretório que você possa ler, ele find / -iname book1o encontrará. Tem certeza de que é realmente Book1, e não Book1.xyz?
Fox

O nome completo do arquivo é Book1.gnumeric. Você está dizendo que eu tenho que especificar o nome inteiro do arquivo? Por alguma razão, pensei, para esse comando específico, que tudo que eu precisaria seria o nome geral do arquivo. Meu teste está tentando encontrar um arquivo se, por exemplo, não me lembro da extensão do arquivo e só sei o nome do arquivo que estou procurando. Por favor informar.
Aspire27

@don_crissti Concluído. Por favor, veja acima Edit.
precisa saber é o seguinte

Você está misturando find e locate. locateé generoso e encontrará qualquer coisa que corresponda, desde que esteja em seu banco de dados, que é normalmente atualizado diariamente. find, nesse caso, está procurando um arquivo glob, o tipo de padrão em que você usaria ls. Você provavelmente quer dizer iname '*book1*'. Observe que o padrão deve estar entre aspas para impedir que o shell o expanda antes de findpoder vê-lo. Observe também que find, como muitos comandos * nix, é frustrantemente silencioso quando malsucedido.
Manngo

Respostas:


31

Primeiro, um argumento para -inameé um padrão de shell . Você pode ler mais sobre padrões no manual do Bash . A essência é que, para findrealmente encontrar um arquivo, o nome do arquivo deve corresponder ao padrão especificado. Para fazer com que uma string que não diferencia maiúsculas de minúsculas book1corresponda, Book1.gnumericé necessário adicionar *para que fique assim:

find / -iname 'book1*'

ou especifique o nome completo:

find / -iname 'Book1.gnumeric'

Em segundo lugar, -inamevai fazer findignorar o caso filename por isso, se você especificar -iname book1também pode encontrar Book1, bOok1etc. Se você tem certeza que o arquivo que você está procurando é chamado Book1.gnumeric , então não use -iname, mas -name, será mais rápido:

find / -name 'Book1.gnumeric'

Terceiro, lembre-se de citar o padrão como dito na outra resposta .

E por último - você tem certeza de que deseja procurar o arquivo em qualquer lugar do seu sistema? É possível que o arquivo que você está procurando esteja realmente no seu $HOMEdiretório, se você trabalhou nele ou fez o download de algum lugar. Novamente, isso pode ser muito mais rápido.

EDIT :

Notei que você editou sua pergunta. Se você não souber o nome completo do arquivo, letras maiúsculas e localização, deve usar algo como isto:

find / -iname 'book1*'

Sugiro também colocar 2>/dev/nullno final da linha para ocultar todos *permission denied*e outros erros que estarão presentes se você chamar findcomo um usuário não root:

find / -iname 'book1*' 2>/dev/null

E se você tiver certeza de que está procurando um único arquivo, e existe apenas um único arquivo no seu sistema que corresponde aos critérios que você pode dizer findpara sair depois de encontrar o primeiro arquivo correspondente:

find / -iname 'book1*' -print -quit 2>/dev/null


6

Você pode tentar o locatecomando Ele usa um banco de dados de nomes de arquivos para tornar a pesquisa mais rápida.

Para procurar todos os arquivos correspondentes *book1*e ignorar maiúsculas e minúsculas, você pode usar

locate -i book1

se você quiser procurar por arquivos começando com book1, precisará fazer o curinga:

locate -i 'book1*'

É muito mais rápido que find, mas é tão atualizado quanto a última vez que o banco de dados foi atualizado.


5

Se você sabe que possui um arquivo chamado book1.something, onde o local do arquivo, o valor exato de somethinge o padrão de maiúsculas e minúsculas do nome do arquivo são todos desconhecidos:

find / -iname 'book1.*'

Se tudo o que você tem certeza é que o nome do arquivo contém a palavra book, é possível gerar uma lista provavelmente muito maior com

find / -iname '*book*'

O argumento para -nameé um padrão glob shell. 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 -inameopção simplesmente permite uma versão que não diferencia maiúsculas de minúsculas disso.


1

POSIXly,

LC_ALL=C find / -name '*[bB][oO][oO][kK]1*'

Irá relatar o caminho de todos os arquivos cujo nome contém book1(com qualquer variação de caso, mas considerando apenas os caracteres latinos ASCII bokBOK, e não as muitas outras variações em Unicode como 𝗄, 𝚔, 𝘬, , , , e todas as suas variações com diacríticos ...) em todos os diretórios aos quais você tem acesso de leitura.


0

Para esses tipos de tarefas, eu sempre faço: find / -iregex '.*Book1.*'

Esse formulário cuidaria dos 3 pontos do seu cenário ( iregexé uma expressão racional que não diferencia maiúsculas de minúsculas, e o padrão com .*ambos os lados corresponderia a qualquer caractere antes e depois do seu padrão fixo do Book1 - isso obviamente poderia fornecer mais resultados do que o necessário mas com certeza não perderá o arquivo)

A principal diferença: se possível, ser mais restritiva do que apenas usando /, como tentar única /homeou mais, caso contrário você vai descer em alguns diretórios que não são relevantes ( /sys, /dev, etc ...)

Lembre-se, no entanto, de que as permissões do Unix se aplicam: se o arquivo estiver em um diretório para o qual o usuário que está executando o findcomando não tem acesso (executar) certo, findnão poderá encontrá-lo lá.


O iregex não funcionará em locais como Solaris (o SO não foi especificado) (e possivelmente * BSD), é uma extensão GNU e não faz parte do padrãofind
Gert van den Berg -

0

O Silver Searcher é um utilitário muito rápido e útil para pesquisar arquivos e conteúdo.

Para resolver seu problema, o comando silver searcher ficaria assim ...

ag -g Book1

-g PATTERN Imprimir nomes de arquivos correspondentes a PATTERN


0

locate e suas variantes tendem a ser um método rápido.

# updatedb # run as root, possibly using sudo, e.g. sudo -b updatedb. If file is on the system for more than a day it should already be in the index and this can be skipped
$ locate -i book1

Se a localização não estiver disponível, você poderá usar find. Tende a ser muito mais lento, mas também muito mais preciso.

Se você tiver uma única partição: (execute como root se o usuário não tiver acesso ao arquivo)

$ find / -xdev -iname 'book1*' -print # If the iname extension to find is available
$ find / -xdev -print | grep -F -i /book1 # if iname is not available

Se você não incluir -xdev findpesquisas em outras partições, como /proce /sys, que tendem a inundar sua tela com erros, especialmente se você não é root. (Os erros podem ser ocultados anexando 2> /dev/null-se ao final do comando find (o comentário deve ser removido))

Se você tiver várias partições e não souber em qual arquivo está, poderá obter uma lista lsblk(em sistemas operacionais baseados em Linux, analisar a dfsaída é uma opção de outra forma) e alimentá-la para localizar: (raiz novamente se você não sei se você pode acessar o arquivo)

$ find $(lsblk -O MOUNTPOINT -n | grep -F /) -xdev -iname 'book1*' -print # GNU-based OSes
$ find $(df -P|awk '$1 ~ /^\/dev/ {print $NF}') -xdev | grep -F -i book1 # Non-GNU based OSes.

(Isso é um pouco frágil se qualquer um de seus pontos de montagem tiver espaços) (os dfparâmetros podem precisar de ajuste. -P faz o GNU dffornecer uma saída POSIX padrão. Outras versões podem ter outros parâmetros ou precisam ser deixados de fora. Leia sua página de manual)

O grep -Fexclui outras coisas retornadas, como partições de troca.

Na versão não-GNU, o awk encontra dispositivos com uma montagem começando com /devpara obter sistemas de arquivos reais e, em seguida, imprime o último campo (o ponto de montagem) a partir da dfsaída.

Isso também pressupõe um shell do tipo bourne ( kshe bashdeve funcionar. Se você estiver usando uma cshvariante, inicie um shell com script antes de tentar isso)


Os greps podem ser um pouco barulhentos, aprender a filtrá-lo melhor (isso não deve ser necessário com o exemplo, mas se for algo mais comum, os greps precisariam de ajuste para manter os níveis de ruído baixos)
Gert van den Berg

0

ag (o pesquisador prateado) fornece uma pesquisa muito rápida em arquivos e também tem uma opção para procurar pelo nome do arquivo:

>: time ag -g foo # uses heuristics to only look in desired locations
apps/vxy/src/assets/tree-content-pages/tree-page-bird/foo-illustration.jpg

real    0m0.884s
user    0m0.701s
sys     0m0.178s

>: time find . -name "*foo*"
./apps/ssr/dist/static/media/foo-illustration.jpg
./apps/vxy/dist/static/media/foo-illustration.jpg
./apps/vxy/src/assets/tree-content-pages/tree-page-bird/foo-illustration.jpg

real    0m29.744s
user    0m2.108s
sys     0m13.982s

>: time ag -ug foo # searching all files is still faster and simpler to use then find command
apps/ssr/dist/static/media/foo-illustration.jpg
apps/vxy/dist/static/media/foo-illustration.jpg
apps/vxy/src/assets/tree-content-pages/tree-page-bird/foo-illustration.jpg

real    0m16.698s
user    0m1.951s
sys     0m7.119s

Portanto, no meu caso de uso aqui, é> 30 vezes mais rápido se o arquivo não for ignorado pelo ag.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.