comando para localizar arquivos pesquisando apenas parte de seus nomes?

32

Digamos que haja arquivos com nomes:

batman.c
debate.c
cricketbat.c

Que comando e como devo usá-lo para listar todos esses arquivos usando a tag de pesquisa bat?

srk_cb
fonte
5
Deseja listar os arquivos correspondentes apenas no diretório atual? em qualquer diretório no diretório atual ou abaixo dele? em qualquer lugar do sistema?
Steeldriver # 8/15

Respostas:

47

Localizando arquivos com o batAnywhere

Para encontrar todos os arquivos em qualquer lugar /path/to/foldercujos nomes contenham bat, você pode usar:

find /path/to/folder -name '*bat*'

Tenho citado o padrão de pesquisa *bat*, porque, se as cotações foram omitidos e arquivos corresponder *bat*no diretório atual, o shell irá expandir *bat*em uma lista deles e passar isso para find. Então findnão funcionaria direito. ( \*bat\*e "*bat*"também funciona.)

Para pesquisar na pasta em que você está atualmente (por exemplo, para quem cdeditou), use .como de costume:

find . -name '*bat*'

Para pesquisar em todo o computador, use/ . Para pesquisar no diretório inicial, use ~ou o nome completo do diretório inicial. ( O shell se expande~ para o caminho totalmente qualificado do diretório inicial.)

Ampliando ou restringindo sua pesquisa, com base no nome

Se você deseja pesquisar caso insensível, então arquivos contendo BAT, bAte assim por diante são correspondidos, usar o -inameteste em vez do -nameteste:

find /path/to/folder -iname '*bat*'

Percebi que todos os seus arquivos terminam .c. Se você deseja apenas encontrar arquivos assim, use:

find /path/to/folder -name '*bat*.c'

Notei que todos os seus nomes de arquivos têm batno início ou no final da parte que precede o .csufixo. Se você deseja evitar a correspondência de arquivos como embattled.c, pode usar:

find /path/to/folder -name '*bat.c' -o -name 'bat*.c'

-oé o operador ou .

Arquivos Somente Correspondentes

Para encontrar apenas arquivos regulares - e não pastas, links simbólicos e nós de dispositivos especiais - você pode usar -type f. Isso é frequentemente recomendado e, às vezes, bastante apropriado ... mas geralmente não é o que você realmente deseja , especialmente se você estiver executando findcom o objetivo de examinar a saída você mesmo. Se você tivesse um link simbólico que correspondesse à sua pesquisa, não gostaria de saber?

Se você deseja encontrar arquivos regulares e links simbólicos, pode usar:

find /path/to/folder -name '*bat*' \( -type f -o -type l \)

Isso usa o -ooperador e também parênteses para o agrupamento (que deve ser citado para que o shell não os trate especialmente; caso contrário, você receberá um erro de sintaxe).

Mas suponha que você queira ver apenas links simbólicos que, em última análise, apontam para um arquivo regular (e não links simbólicos para diretórios, nós de dispositivos etc.). Na verdade, isso é ainda mais simples: use em -xtypevez de -type. Desde que você não está correndo findcom -Lbandeira, -xtypeem um link simbólico testa o tipo do arquivo o link aponta.

find /path/to/folder -name '*bat*' -xtype f

Se você tiver um link simbólico para outro link simbólico para um arquivo, -xtype fele corresponderá, mesmo que seu destino direto seja outro link simbólico, e não um arquivo comum. Isso é quase sempre o que você deseja.

Muitas vezes, as pessoas pensam que querem -type f, mas realmente querem -xtype f.

Obtendo saída detalhada

findA ação padrão de se você não especificar uma é -print. Todos os comandos dados acima são equivalentes a si mesmos, com os -printtacheados no final.

findé frequentemente usado para executar comandos com base nos arquivos encontrados - geralmente, comandos que fazem alterações. Mas também existem outras ações cujo objetivo é exibir resultados -print. De particular interesse é -ls:

find /path/to/folder -name '*bat*' -ls

Isso fornece informações detalhadas sobre cada arquivo, em um formato de várias colunas, semelhante (embora não seja o mesmo) ao que você veria executando .ls file

Leitura adicional

Para obter mais informações finde outras maneiras de encontrar arquivos, consulte:

Eliah Kagan
fonte
1
Ótima resposta, especialmente os -xtypeconselhos; talvez ls *bat*e -maxdepth/ mindepthtambém valha a pena mencionar.
mklement0
2
@ mklement0 Obrigado! O OP ainda não forneceu esclarecimentos sobre onde estão os arquivos e se a recursão é ou não necessária. Como a resposta do caosls já foi abordada , concentrei-me no caso recursivo findaqui. Obviamente, uma resposta detalhada cobrindo uma lista não (ou menos) -recursiva de nomes de arquivos que correspondam a algum padrão ( lse findcom -maxdepth) também seria útil. Você pode postar essa resposta!
Eliah Kagan
16

A maneira mais fácil é correr

locate bat

Dessa forma, você pode procurar em todo o computador arquivos que contenham "bat" no nome do arquivo

Para atualizar a lista de arquivos no seu PC, execute

updatedb

Execute este comando quando você adicionou recentemente novos arquivos à sua conta

Mark Kirby
fonte
1
necessidadesupdatetdb
Sergiy Kolodyazhnyy
4
@Serg Para encontrar novos arquivos (os mais recentes que a última vez que updatedbforam executados manualmente ou automaticamente), sudo updatedbseria necessário executar primeiro, sim.
Eliah Kagan
Observe que isso pesquisará todo o sistema em busca de nomes correspondentes bat.
terdon
1
@terdon Eu já afirmei isso na resposta, não acho que merecesse o voto negativo quando já afirmei isso.
Mark Kirby
1
Observe que isso é MUITO mais rápido do que find /as locatepesquisas em um banco de dados, enquanto findrecursivamente lista /e corresponde ao regex.
Timothy Gu
14

Abra o terminal e altere os diretórios para o diretório de onde você deseja iniciar a pesquisa e, em seguida, execute este comando:

find . -name "*bat*" -type f 

O .inicia o comando find a partir do diretório atual.
A -namecorresponde a seqüência bate é sensível a maiúsculas. ( -inameDiferencia maiúsculas de minúsculas)
As -type fpesquisas para apenas arquivos.

karel
fonte
excluir e recuperar? ok +1: P;)
AB
6

Se os arquivos estiverem no diretório atual, use:

$ ls *bat*
batgirl.c  batman.c  batwoman.c  cricketbat.c

Ou (para tê-los linha por linha):

$ ls -1 *bat*
batgirl.c
batman.c
batwoman.c
cricketbat.c

Se você deseja pesquisar no sistema por esses arquivos, use:

$ find / -name "*bat*"
/path/to/cricketbat.c
/path/to/batgirl.c
/path/to/batwoman.c
/path/to/batman.c
caos
fonte
1
Se sua pesquisa está começando com o diretório raiz, você pode adicionar o sudo, pois esse comando reportará 'Permissão negada' para algumas pastas
Sergiy Kolodyazhnyy
4

Você deseja usar o findcomando, com a -inameopção de correspondência de nome de arquivo que não diferencia maiúsculas de minúsculas ou a -nameopção de nome de arquivo que diferencia maiúsculas de minúsculas. Ambos permitem que você use nomes curinga. Portanto, para encontrar qualquer nome de arquivo que contenha "bat", você usaria:

find / -iname '*bat*'

Ou

find / -name '*bat*'

Como *significa "qualquer caractere (s)", a pesquisa está procurando por batqualquer caractere, incluindo nenhum, antes ou depois dele. As /pesquisas no diretório raiz recursivamente, você pode usar o .que pesquisará recursivamente no diretório atual ou o caminho absoluto para onde você deseja pesquisar. Veja como procurar arquivos usando regex no script shell linux

AJefferiss
fonte
@EliahKagan obrigado, adicionei mais algumas informações à minha resposta.
AJefferiss
+1 Obrigado pela edição. Na IMO, é uma força dessa resposta que evita recomendar o uso indiscriminado de -type f, o que faz mais do que simplesmente excluir diretórios e geralmente não é o que os usuários realmente desejam .
Eliah Kagan
2

Use o bom e velho find.

find <path_for_search> -type f -iname "*bat*" 

por exemplo.:

% find . -type f -iname "*bat*" 
./batgirl.c
./batwoman.c
./cricketbat.c
./batman.c

de man find:

-type c
          File is of type c:
          [..]
          d      directory
          [..]
          f      regular file
          [..]

-iname pattern 
          Like -name, but the match is case insensitive.
AB
fonte