comando para encontrar arquivos pesquisando apenas parte de seus nomes?

21

Diga que existem arquivos com nomes:

batman.c
debate.c
cricketbat.c

Qual comando e como devo usá-lo para listar todos esses arquivos usando o searchtag bat ?

    
por srk_cb 08.05.2015 / 14:44
fonte

6 respostas

30

Localizando arquivos com bat em qualquer lugar

Para localizar todos os arquivos em qualquer lugar dentro de /path/to/folder cujos nomes contenham bat , você pode usar:

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

Eu tenho entre o padrão de pesquisa *bat* porque, se as citações foram omitidas e os arquivos correspondem *bat* no diretório atual, o shell expandirá *bat* para uma lista deles e passará esse para find . Então find não funcionaria direito. ( \*bat\* e "*bat*" também funcionam.)

Para pesquisar na pasta em que você está no momento (por exemplo, para a qual você tem cd ), use . , como de costume:

find . -name '*bat*'

Para pesquisar em todo o seu computador, use / . Para pesquisar em seu diretório pessoal, use ~ ou o nome completo do seu diretório pessoal. ( O shell expande ~ para o caminho completo do diretório de origem.)

Ampliando ou restringindo sua pesquisa, com base no nome

Se você quiser pesquisar sem diferenciar maiúsculas e minúsculas, para que arquivos que contenham BAT , bAt e assim por diante sejam correspondidos, use o teste -iname em vez do teste -name :

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

Eu notei que todos os seus arquivos terminam em .c . Se você quiser apenas encontrar arquivos como esse, use:

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

Eu notei que todos os seus nomes de arquivos têm bat no início ou no final da parte que precede o sufixo .c . Se você quiser evitar arquivos correspondentes como embattled.c , use:

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

-o é o operador ou .

Correspondendo somente arquivos

Para localizar apenas arquivos comuns - e não pastas, links simbólicos, e nós de dispositivos especiais - você pode usar -type f . Isso é freqüentemente recomendado e, às vezes, bastante apropriado ... mas geralmente não é o que você realmente quer , especialmente se você estiver executando find para o propósito de examinar a saída. Se você tivesse um link simbólico que correspondesse à sua pesquisa, você não gostaria de saber sobre isso?

Se você quiser encontrar arquivos regulares e links simbólicos, use:

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

Isso usa o operador -o 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ê obterá um erro de sintaxe).

Mas suponha que você queira apenas ver links simbólicos que apontam para um arquivo regular (e não links simbólicos para diretórios, nós de dispositivos etc.). Na verdade, é ainda mais simples: use -xtype em vez de -type . Desde que você não esteja executando find com -L flag, -xtype em um link simbólico testa o tipo do arquivo para o qual 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 f irá combiná-lo mesmo que seu destino direto seja outro link simbólico em vez de um arquivo normal. Isso é quase sempre o que você quer.

Muitas vezes as pessoas acham que querem -type f , mas na verdade querem -xtype f .

Obtendo uma saída detalhada

A ação padrão de

find , se você não especificar uma, será -print . Todos os comandos dados acima são equivalentes a eles mesmos com -print colados no final.

find é frequentemente usado para executar comandos com base nos arquivos encontrados - geralmente, comandos que fazem alterações. Mas há também outras ações cuja finalidade é exibir resultados, além de -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 a (embora não exatamente o mesmo que) o que você veria executando ls file .

Leitura adicional

Para mais informações sobre find e outras formas de encontrar arquivos, consulte:

por Eliah Kagan 08.05.2015 / 15:43
fonte
16

A maneira mais fácil é executar

locate bat

Desta forma, você pode pesquisar em todo o computador por arquivos contendo "bat" no nome do arquivo

Para atualizar a lista de arquivos no seu PC, execute

updatedb

Execute este comando quando tiver adicionado recentemente novos arquivos à sua conta     

por Mark Kirby 08.05.2015 / 14:49
fonte
14

Abra o terminal e altere os diretórios para o diretório de onde 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.
O -name corresponde à string bat e diferencia maiúsculas de minúsculas. ( -iname não faz distinção entre maiúsculas e minúsculas)
O -type f procura apenas por arquivos.

    
por karel 08.05.2015 / 14:46
fonte
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ê quiser procurar 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
    
por chaos 08.05.2015 / 15:00
fonte
4

Você deseja usar o comando find , com a opção -iname para correspondência de nomes de arquivos sem distinção entre maiúsculas e minúsculas, ou a opção -name para correspondências de nomes de arquivos com distinção entre maiúsculas e minúsculas. Ambos permitem que você use nomes curinga. Então, para encontrar qualquer nome de arquivo que contenha "bat" você usaria:

find / -iname '*bat*'

Ou

find / -name '*bat*'

O * significa "qualquer caractere (s)", portanto, a pesquisa está procurando bat com qualquer caractere, incluindo nenhum, antes ou depois dele. O / pesquisa o diretório raiz recursivamente, você pode usar . , que pesquisará recursivamente a partir do diretório atual ou o caminho absoluto para onde você deseja pesquisar. Dê uma olhada em como procurar por arquivos usando regex no linux script de shell

    
por AJefferiss 08.05.2015 / 14:46
fonte
1

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.
    
por A.B. 08.05.2015 / 15:09
fonte