Como encontrar um arquivo em qualquer diretório

Estou tentando procurar um arquivo chamado Book1 .

Em meu teste, estou tentando procurar o arquivo mencionado anteriormente e, neste teste, não sei onde esse arquivo está localizado.

Eu tentei find / -iname book1 mas não houve 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 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 a localização do arquivo é desconhecida

Comentários

  • Se houver um arquivo chamado Book1, e está em um diretório que você pode ler, então find / -iname book1 o encontrará. Tem certeza de que é realmente Book1, e não Book1.xyz?
  • O nome completo do arquivo é Book1. gnumeric. Você está dizendo que devo especificar o nome completo do arquivo? Por alguma razão, pensei, para este comando específico, que tudo que eu ‘ d precisava é o nome geral do arquivo. Meu teste está tentando encontrar um arquivo se, por exemplo, eu não ‘ não me lembro da extensão do arquivo e apenas sei o nome do arquivo que ‘ estou procurando. Por favor, avise.
  • @don_crissti Feito. Consulte Editar acima.
  • 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, neste caso, está procurando por um arquivo glob, o tipo de padrão que você usaria em ls. Você provavelmente quer dizer iname '*book1*'. Observe que o padrão deve estar entre aspas para impedir que o shell o expanda antes que find o veja. Observe também que find, como muitos comandos * nix, é frustrantemente silencioso quando não tem êxito.

Resposta

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 que find realmente encontre 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 book1 corresponda a Book1.gnumeric, você deve adicionar * para tem a seguinte aparência:

find / -iname "book1*" 

ou especifique o nome completo:

find / -iname "Book1.gnumeric" 

Segundo , -iname fará com que find ignore a caixa do nome do arquivo, portanto, se você especificar -iname book1, também pode encontre Book1, bOok1 etc. Se você “tiver certeza de que o arquivo que está procurando” se chama 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 – são tem certeza de que deseja procurar o arquivo em todos os lugares em seu sistema? É possível que o arquivo que você está procurando esteja na verdade em $HOME diretório se você trabalhou nisso ou baixou de algum lugar. Novamente, isso pode ser muito mais rápido.

EDITAR :

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

find / -iname "book1*" 

Também sugiro colocar 2>/dev/null no final da linha para ocultar todos os *permission denied* e outros erros que estarão presentes se você invocar find como 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 houver apenas um único arquivo em seu sistema que corresponde aos critérios que você pode dizer find para sair após encontrar o primeiro arquivo correspondente:

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

Comentários

Resposta

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

Para pesquisar todos os arquivos correspondentes a *book1* e ignorando maiúsculas e minúsculas, você pode usar

locate -i book1 

se desejar pesquisar arquivos começando com book1, você precisará fazer o curinga você mesmo:

locate -i "book1*" 

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

Comentários

  • Nenhum deles produziu qualquer saída para mim: locate -i after.sh, sudo locate -i "after.sh", sudo locate -i after.sh, sudo locate -i '*after.sh'

Resposta

Se você sabe que tem um arquivo chamado book1.something, onde o local do arquivo, o valor exato de something , e o padrão de capitalização 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 , 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 opção -iname simplesmente permite uma versão que não diferencia maiúsculas de minúsculas.

Resposta

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, não as muitas outras variações em Unicode como 𝗄, 𝚔, 𝘬, , , , e todas as suas variações com sinais diacríticos …) em todos os diretórios aos quais você tem acesso de leitura.

Resposta

Com Zsh, você pode usar padrões glob, então isso também funciona:

ls -a /**/book1 

Isso vai encontre todos os locais onde um arquivo chamado book1 reside.

Em meus testes, isso parece ser mais rápido do que usar find, e também produz pouco ou nenhum erros de permissão do usuário quando executado sem permissão de root

Consulte manual .

Resposta

Para esses tipos de tarefas que sempre faço: find / -iregex ".*Book1.*"

Esta forma 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 .* em ambos os lados corresponderia a qualquer caractere antes e depois de seu padrão fixo de Livro1 – isso poderia obviamente fornecer mais resultados do que o necessário, mas você não perderá o arquivo)

A principal diferença: se possível, seja mais restritivo do que apenas usar /, como tentar apenas /home ou algo assim, caso contrário você descerá em alguns diretórios que não são relevantes (/sys, /dev, etc…)

Lembre-se, entretanto, que Unix permissi ons se aplicam: se o arquivo estiver em um diretório para o qual o usuário executando o comando find não tem direito de acesso (executar), find não será capaz de encontrá-lo lá.

Comentários

  • iregex não ‘ funcionará em lugares como Solaris (o sistema operacional não foi especificado) (e possivelmente * BSD), é uma extensão GNU e não faz parte do padrão find

Resposta

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

Para resolver seu problema, o comando do silver searcher seria parecido com este …

ag -g Book1

-g PATTERN Imprimir nomes de arquivos correspondentes ao PADRÃO

Resposta

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 localizar não é avai etiqueta, você pode usar find em seu lugar. Ele tende a ser muito mais lento, mas também muito mais preciso.

Se você tiver uma única partição: (execute como root se o seu 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 find pesquisar coisas em outras partições, como /proc e /sys, que tendem a inundar sua tela com erros, especialmente se você não for root.(Os erros podem ser ocultados anexando 2> /dev/null ao final do comando find (o comentário deve ser removido))

Se você tiver várias partições e não ” para saber em qual deles o arquivo está, você pode obter uma lista com lsblk (em sistemas operacionais baseados em Linux, analisando df a saída é uma opção caso contrário) e coloque-o no find: (root novamente se você não souber se 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 algum de seus pontos de montagem tiver espaços) (df parâmetros podem precisar de ajuste. -P torna GNU df fornecer saída POSIX padrão. versões podem ter outros parâmetros ou precisam ser deixados de fora. Leia sua página de manual)

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

Na versão não GNU, awk encontra dispositivos com uma montagem começando com /dev para obter sistemas de arquivos reais e depois imprimir o último campo d (o ponto de montagem) da saída df.

Isso também pressupõe um shell do tipo bourne (ksh e bash deve funcionar. Se você estiver usando uma csh variante, inicie um shell programável antes de tentar isso)

Comentários

  • Os grep s podem ser um pouco barulhentos, aprenda como filtrá-lo melhor (isso não deve ser necessário com o exemplo, mas se for algo mais comum que é procurado, os greps precisaria de ajuste para manter os níveis de ruído baixos)

Resposta

ag (o buscador prateado) fornece uma pesquisa muito rápida em arquivos e também tem uma opção para pesquisar por nome de 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 

Então no meu caso de uso aqui, é “s> 30 vezes mais rápido se o arquivo não for um arquivo ignorado por ag.

Resposta

find / -type f -iname "book[0-9].*" 

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *