Como posso pesquisar um arquivo pelo nome e caminho parcial?


64

Frequentemente, tenho um nome de arquivo e seu caminho parcial, por exemplo, "content / docs / file.xml".

Existe uma maneira simples de pesquisar esse arquivo, sem cortar manualmente em partes seu nome para fornecer o nome do diretório e o nome do arquivo separadamente?

Seria ótimo se findfuncionasse dessa maneira, para que eu pudesse correr find content/docs/file.xml, mas infelizmente não funciona.


11
Você pode tentar adicionar um curinga * no início. find -path *content/docs/file.xmltrabalhou para mim.
Bob

obrigado, @Bob, realmente funcionou para mim. Aliás, interessante, que se eu estiver adicionando uma barra após um asterisco: "find -path * / content / docs / file.xml", não funcionará. Muito obrigado mesmo assim.

@Bob, faça isso como uma resposta e eu vou marcar como correto.

A razão pela qual a barra após o asterisco não funcionou é provavelmente porque o asterisco deveria ter escapado, veja a edição na minha resposta.
Bob

Respostas:


72

Passe um *curinga para indicar uma correspondência para qualquer coisa . Você também precisa escapar do *s, por exemplo:

find . -path \*content/docs/file.xml

ou coloque o padrão entre aspas, por exemplo:

find . -path "*content/docs/file.xml"

Como a página do manual descreve:

$ find. -name * .c -print

find: os caminhos devem preceder a expressão

Isso acontece porque * .c foi expandido pelo shell, resultando na busca de realmente receber uma linha de comando como esta:

encontrar . -name bigram.c code.c frcode.c localize.c

É claro que esse comando não vai funcionar. Em vez de fazer as coisas dessa maneira, você deve colocar o padrão entre aspas ou escapar do curinga:

$ find. -name \ *. c -print


10

O find também possui uma opção -wholename find $top_dir -wholename *string*

find /usr -wholename *in/abiw*

>/usr/bin/abiword

Não sei o caminho completo, apenas parcial, para que "-wholename" não funcione.

a bandeira é enganosa, ver o meu exemplo ... ele apenas permite estender a string em um diretório se você sabe disso
Technosaurus

3
find . -type f | grep "content/docs/file.xml"

ou apenas

locate content/docs/file.xml

localize é uma opção interessante, mas ele pesquisa todo o disco, gostaria de poder especificar o diretório de pesquisa base ou, pelo menos, especificar usando param, que a pesquisa deve ser feita nesse diretório (como sua primeira opção) , não da raiz.

11
@ user69817 - pelo contrário, a localização não pesquisa o disco, ele interroga um banco de dados de localização, que normalmente é preenchido via cron uma vez por dia.
tink

1

Por exemplo, pesquisando arquivos em um local usando asterisco / curinga ( *) como: dir=“/apps/*/instance01/" você pode usar find ${dir} -name “*.jks”. colocando todos os arquivos em uma matriz como esta:

arr=(`find ${dir} -name “*.jks"`)

se você deseja obter arquivos com outras extensões, use 'ou' assim:

-name "*.keystore" -o -name "*.jks" -o -name “*.p12" porque -nameaceita apenas uma sequência, use 'ou'.

Por fim, coloque tudo em array como este:

arr=(`find ${dir} -name "*.keystore" -o -name "*.jks" -o -name "*.p12"`)

se você possui caminhos completos e não parciais, é muito mais fácil colocá-los em matrizes como esta:

arr=(“/Users/ajay/Documents/keystore_and_p12files/"*.{keystore,p12,jks})
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.