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
Aspire27
fonte
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
Arkadiusz Drabczyk
fonte
1
-inamenão é portátil
Gert van den Berg
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.

James K
fonte
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.

Raposa
fonte
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.

Stéphane Chazelas
fonte
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á.

Patrick Mevzek
fonte
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

qoomon
fonte
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)

Gert van den Berg
fonte
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.

tomtt
fonte