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:
- A extensão do arquivo é desconhecida
- O nome exato (ou seja, letras maiúsculas, números, etc.) é desconhecido
- O a localização do arquivo é desconhecida
Comentários
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 𝗄
, 𝚔
, 𝘬
, ᵏ
, ₖ
, K
, k
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].*"
Book1
, e está em um diretório que você pode ler, entãofind / -iname book1
o encontrará. Tem certeza de que é realmenteBook1
, e nãoBook1.xyz
?find
elocate
.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 emls
. Você provavelmente quer dizeriname '*book1*'
. Observe que o padrão deve estar entre aspas para impedir que o shell o expanda antes quefind
o veja. Observe também quefind
, como muitos comandos * nix, é frustrantemente silencioso quando não tem êxito.