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 book1
mas 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:
- A extensão do arquivo é desconhecida
- O nome exato (ou seja, letras maiúsculas, números etc.) é desconhecido
- O local do arquivo é desconhecido
command-line
files
find
Aspire27
fonte
fonte
Book1
e ele estiver em um diretório que você possa ler, elefind / -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
, nesse caso, está procurando um arquivo glob, o tipo de padrão em que você usarials
. Você provavelmente quer dizeriname '*book1*'
. Observe que o padrão deve estar entre aspas para impedir que o shell o expanda antes defind
poder vê-lo. Observe também quefind
, como muitos comandos * nix, é frustrantemente silencioso quando malsucedido.Respostas:
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, parafind
realmente 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úsculasbook1
corresponda,Book1.gnumeric
é necessário adicionar*
para que fique assim:ou especifique o nome completo:
Em segundo lugar,
-iname
vai fazerfind
ignorar o caso filename por isso, se você especificar-iname book1
também pode encontrarBook1
,bOok1
etc. Se você tem certeza que o arquivo que você está procurando é chamadoBook1.gnumeric
, então não use-iname
, mas-name
, será mais rápido: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
$HOME
diretó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:
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ê chamarfind
como um usuário não root: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
find
para sair depois de encontrar o primeiro arquivo correspondente:fonte
-iname
não é portátilVocê pode tentar o
locate
comando 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 usarse você quiser procurar por arquivos começando com
book1
, precisará fazer o curinga:É muito mais rápido que
find
, mas é tão atualizado quanto a última vez que o banco de dados foi atualizado.fonte
Se você sabe que possui um arquivo chamado
book1.something
, onde o local do arquivo, o valor exato desomething
e o padrão de maiúsculas e minúsculas do nome do arquivo são todos desconhecidos: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 comO argumento para
-name
é um padrão glob shell. No diretório em que o arquivo está, compare: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 disso.fonte
POSIXly,
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 ASCIIbokBOK
, e não as muitas outras variações em Unicode como𝗄
,𝚔
,𝘬
,ᵏ
,ₖ
,K
,k
e todas as suas variações com diacríticos ...) em todos os diretórios aos quais você tem acesso de leitura.fonte
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/home
ou 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
find
comando não tem acesso (executar) certo,find
não poderá encontrá-lo lá.fonte
find
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 PATTERNfonte
locate
e suas variantes tendem a ser um método rápido.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)
Se você não incluir
-xdev
find
pesquisas em outras partições, como/proc
e/sys
, que tendem a inundar sua tela com erros, especialmente se você não é root. (Os erros podem ser ocultados anexando2> /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 adf
saí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)(Isso é um pouco frágil se qualquer um de seus pontos de montagem tiver espaços) (os
df
parâmetros podem precisar de ajuste. -P faz o GNUdf
fornecer 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 -F
exclui outras coisas retornadas, como partições de troca.Na versão não-GNU, o awk encontra dispositivos com uma montagem começando com
/dev
para obter sistemas de arquivos reais e, em seguida, imprime o último campo (o ponto de montagem) a partir dadf
saída.Isso também pressupõe um shell do tipo bourne (
ksh
ebash
deve funcionar. Se você estiver usando umacsh
variante, inicie um shell com script antes de tentar isso)fonte
grep
s 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)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:
Portanto, no meu caso de uso aqui, é> 30 vezes mais rápido se o arquivo não for ignorado pelo ag.
fonte