Como posso encontrar recursivamente todos os arquivos nas atuais e subpastas com base na correspondência de caracteres curinga?

1888

Como posso encontrar recursivamente todos os arquivos nas atuais e subpastas com base na correspondência de caracteres curinga?

John
fonte

Respostas:

2742

Use find para isso:

find . -name "foo*"

findprecisa de um ponto de partida e o .(ponto) aponta para o diretório atual.

tux21b
fonte
21
Eu sei que isso está marcado como linux, mas vale a pena mencionar: o caminho é necessário para outras variantes * nix que não são linux. No linux, o caminho é opcional se você deseja usar o ponto.
IslandCow
4
O @Seatter "foo *" diz ao find para procurar todos os arquivos que começam com "foo". É apenas o exemplo dele. Você pode usar "gpio *" para encontrar todos os arquivos cujos nomes começam com gpio, ou apenas "gpio1" para encontrar todos os arquivos chamados gpio1.
precisa saber é o seguinte
29
observe que o "foo *" está entre aspas para que o shell não o expanda antes de passá-lo para encontrar. se você apenas o fizesse find . foo*, o foo*seria expandido E depois passou a encontrar.
Grinch
33
Vale ressaltar que " "é muito necessário para pesquisas recursivas.
WesternGun 21/10
3
Também é útil: se você não deseja ser notificado sobre diretórios aos quais não tem permissão (ou outros erros), pode fazêfind . -name "foo*" 2>/dev/null
#
222

A localização da tubulação no grep é geralmente mais conveniente; fornece a você todo o poder de expressões regulares para correspondência arbitrária de caracteres curinga.

Por exemplo, para encontrar todos os arquivos com a string "foo" que não diferencia maiúsculas de minúsculas no nome do arquivo:

~$ find . -print | grep -i foo
Paul Whipp
fonte
58
findtambém tem as -iname, -regexe -iregexbandeiras para case-insensitive curinga, regex, e correspondência de regex case-insensitive, por isso conduz às grepé desnecessário.
iobender
7
Não acho que seja desnecessário, mas mais conveniente.
Elijah Lynn
1
No entanto, o canal para grep -v pode permitir que você use sequências simples ou expressões regulares para remover as entradas que você não deseja.
door_number_three
3
@iobender - Infelizmente, posso dizer por experiência que nem todos os sistemas vêm com um findcomando que suporta essas opções. Às vezes grepse torna a única opção.
Llama
150

find encontrará todos os arquivos que correspondem a um padrão:

find . -name "*foo"

No entanto, se você quiser uma imagem:

tree -P "*foo"

Espero que isto ajude!

IslandCow
fonte
18
brew install treepara usuários de Mac OSX w / o apt-getinstalado
DeBraid
1
Testado no macOS Sierra, basta adicionar '--print' -> 'find. nome "* foo" --print '. superuser.com/questions/177289/searching-mac-through-terminal
john-salib
2
sudo yum install -y árvore para CentOS
Santosh Kumar Arjunan
39
find -L . -name "foo*"

Em alguns casos, eu precisava do parâmetro -L para manipular links de diretório simbólicos. Por padrão, os links simbólicos são ignorados. Nesses casos, era bastante confuso, pois eu mudaria o diretório para um subdiretório e veria o arquivo que correspondia ao padrão, mas a localização não retornaria o nome do arquivo. Usar -L resolve esse problema. As opções de links simbólicos para localizar são -P -L -H

toddcscar
fonte
1
O interruptor L é muito útil. Muitas vezes, o usuário não tem idéia sobre os diretórios subjacentes, sejam eles vinculados ou com diretórios normais. Portanto, em caso de dúvida, é sempre bom usar a opção L. Pelo menos, sempre me ajudou.
Ritesh
2
Essa foi a resposta para mim. Obrigado!
iedmrc 07/04
33

Se o seu shell suportar uma nova opção de globbing (pode ser ativada por :)shopt -s globstar , você pode usar:

echo **/*foo*

para encontrar arquivos ou pastas recursivamente. Isso é suportado pelo Bash 4, zsh e shells semelhantes.


Pessoalmente, eu tenho essa função shell definida:

f() { find . -name "*$1*"; }

Nota: A linha acima pode ser colada diretamente no shell ou adicionada ao ~/.bashrcarquivo do usuário .

Então eu posso procurar por arquivos digitando:

f some_name

Como alternativa, você pode usar um fdutilitário com uma sintaxe simples, por exemplo fd pattern.

kenorb
fonte
1
Isso apenas entra em um único nível. Não recursão nos sub-diretórios para mim
Broncha
3
@Broncha Porque você precisa ativar o globbing estendido por shopt -s globstarcomando. Isso é suportado no Bash, zsh e shells semelhantes.
Kenorb 7/06
bash-3.2$ shopt -s globstarbash: shopt: globstar: invalid shell option name
drewish
@drewish Você precisa atualizar o seu Bash para a
versão
echo * / * foo é menos rápido do que o achado
Josef Klimuk
32

fd

No caso, findé muito lento, tente o fdutilitário - uma alternativa simples e rápida para findescrita em Rust.

Sintaxe:

fd PATTERN

Demo:

Página inicial: https://github.com/sharkdp/fd

kenorb
fonte
17
Primeira vez que vi um gif no SO em quase 9 anos. Bom trabalho!
Joshua Pinter
1
Esses resultados de desempenho parecem muito promissores. Você pode considerar adicionar fd ao home-brew ...
Gr3go 11/01/19
off topic: qual ferramenta você usou para criar o arquivo svg para demonstração?
aprodan
2
@ aprodan A imagem demo foi copiada do GitHub, mas acredito que eles estejam usando asciinema, depois convertida para o formato GIF, mas não tenho certeza.
Kenorb 11/02/19
1
Na verdade, é o formato SVG, então provavelmente asciicast2vectorpode ser usado.
kenorb 12/02/19
27
find <directory_path>  -type f -name "<wildcard-match>"

Na correspondência curinga, você pode fornecer a sequência que deseja corresponder, por exemplo, * .c (para todos os arquivos c)

XYZ_Linux
fonte
1
Sua resposta é a primeira mais correta aqui, pois apenas pesquisa arquivos conforme especificado. Os outros que não especificam o tipo retornarão diretórios.
wilsotc
se você deseja procurar um diretório "-type f" pode ser alterado para "-type d"
XYZ_Linux
11

Você pode usar:

# find . -type f  -name 'text_for_search'

Se você deseja usar o REGX, use -iname

# find . -type f  -iname 'text_for_search'
user8848899
fonte
9

O comando a seguir listará todos os arquivos com o nome exato "padrão" (por exemplo) nas pastas atuais e subpastas.

find ./ -name "pattern"

anshul
fonte
8

A maneira padrão de procurar arquivos recursivos e disponível na maioria dos casos é

find . -name "filepattern"

Ele inicia o deslocamento recursivo para nome de arquivo ou padrão no diretório atual em que você está posicionado. Com o comando find, você pode usar curingas e várias opções para ver a lista completa de opções, digite

man find

ou se as páginas de manual não estiverem disponíveis no seu sistema

find --help

No entanto, existem ferramentas mais modernas e mais rápidas do que as que estão percorrendo todo o sistema de arquivos e indexando seus arquivos. Uma dessas ferramentas comuns é localizar ou slocate / mlocate, você deve verificar o manual do seu sistema operacional sobre como instalá-lo e, uma vez que instalado, ele precisa iniciar o banco de dados; se o script de instalação não fizer isso por você, isso poderá ser feito manualmente, digitando-se

sudo updatedb

E, para usá-lo para procurar algum tipo de arquivo específico

locate filename

Ou, para procurar o nome do arquivo ou o padrão no diretório atual, digite:

 pwd | xargs -n 1 -I {} locate "filepattern"

Ele examinará seu banco de dados de arquivos e imprimirá rapidamente os nomes dos caminhos que correspondem ao padrão digitado. Para ver a lista completa das opções de localização, digite: locate --helpouman locate

Além disso, você pode configurar o localizador para atualizar seu banco de dados em horários agendados por meio de uma tarefa cron, portanto, faça uma amostra do cron que atualiza o banco de dados à 1 da manhã:

0 1 * * * updatedb

Esses trabalhos cron precisam ser configurados pelo root, pois updatedb precisa de privilégios de root para percorrer todo o sistema de arquivos.

Aleksandar Pavić
fonte
7

para pesquisa de arquivos
find / -xdev -name settings.xml -> computador inteiro
find ./ -xdev -name settings.xml -> diretório atual e seu subdiretório

para arquivos com tipo de extensão

find . -type f -name "*.iso"
Alberto
fonte
6

Fico surpreso ao ver que localizar não é muito usado quando devemos recursivamente.

Primeiro, localizava "$ PWD" para obter a lista de arquivos na pasta atual de interesse e, em seguida, executava greps como quisesse.

locate "$PWD" | grep -P <pattern>

Obviamente, isso pressupõe que o updatedb seja feito e o índice seja atualizado periodicamente. Essa é uma maneira muito mais rápida de encontrar arquivos do que executar uma busca e pedir que ela desça na árvore. Mencionando isso para ser completo. Nada contra o uso de find, se a árvore não for muito pesada.

melchi
fonte
locate "$PWD*.mp4" Apenas para lembrar que você pode pular agrep
Jefferey Cave
5

O comando abaixo ajuda a procurar arquivos

1) Independentemente do caso
2) Resultado Excluindo pastas sem permissão
3) Pesquisando a partir da raiz ou do caminho que você deseja. Mude / com o caminho que você preferir.

Sintaxe:
find -iname '' 2> & 1 | grep -v "Permissão negada"

Exemplo

localize / -nome 'C * .xml' 2> & 1 | grep -v "Permissão negada"

find / -iname '*C*.xml'   2>&1 | grep -v "Permission denied"
MukeshKoshyM
fonte
1
por que diabos você usa grep para isso? Apenas stderr redirecionamento para nulafind / -iname '*C*.xml' 2>/dev/null
phuclv
3

Se você deseja pesquisar um arquivo especial com curinga, pode usar o seguinte código:

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

Suponha que você queira pesquisar todos os arquivos .conf daqui:

.significa pesquisa iniciada a partir daqui (local atual)
-typesignifica tipo de item de pesquisa que aqui é o arquivo (f).
-namesignifica que você deseja pesquisar arquivos com nomes * .conf .

Reza Harasani
fonte
3

Isso pesquisará todos os arquivos relacionados nos diretórios atual e subdiretório, calculando sua contagem de linhas separadamente e totalmente:

find . -name "*.wanted" | xargs wc -l
Jay Yang
fonte
2

Usar

find path/to/dir -name "*.ext1" -o -name "*.ext2"

Explicação

  1. O primeiro parâmetro é o diretório que você deseja pesquisar.
  2. Por padrão, findfaz recursão.
  3. O -osignifica -or. Portanto, acima significa procurar esse curinga OU esse. Se você tiver apenas um padrão, não será necessário -o.
  4. As aspas ao redor do padrão curinga são obrigatórias.
Shital Shah
fonte