Como pesquisar todos os arquivos começando com o nome "ABC" em um diretório?

58

Preciso procurar arquivos começando com algum nome específico. Pode haver vários arquivos começando com um padrão específico e desejo listar todos esses arquivos presentes no diretório

R11G
fonte

Respostas:

60

Para concluir as respostas existentes:

ls

O utilitário de lista de diretórios padrão lspode ser usado em combinação com os curingas do shell. Para procurar todos os arquivos com padrão abc:

ls abc*   # list all files starting with abc---
ls *abc*  # list all files containing --abc--
ls *abc   # list all files ending with --abc

Observe que a extensão do arquivo também é relevante para os resultados da pesquisa.


tree

No caso de precisarmos listar arquivos em uma árvore de diretórios, também podemos emitir treepara procurar um determinado padrão como:

tree -P 'abc*'  # list directory tree of file starting with abc---
tree -l 'def*'  # exclude files starting with def---

Nesse caso, treeele próprio suporta caracteres curinga.

Takkat
fonte
2
Por que quando eu ls -l B*mostro o conteúdo de todos os diretórios começando com, em Bvez de apenas os nomes dos diretórios correspondentes?
ErikE 24/01
@ ErikE Porque quando você pede lspara listar um diretório, ele é aberto, é o mesmo que fazer ls -l BirthdayPhotos. Você pode suprimir esse comportamento com ls -d B*.
Azor Ahai 17/04
@AzorAhai Mas por que ele trata B*como uma especificação de diretório?
precisa saber é o seguinte
@ErikE Como o uso do arquivo glob se B*expande para corresponder a todos os diretórios iniciados, Bpara que você realmente passe lsuma lista de diretórios, abre todos eles para você.
Azor Ahai
1
Não responde a pergunta. ls -d ABC*era sobre o que o autor estava perguntando. Os comentários no snippet de código também estão incorretos e ls abc*lista o conteúdo dos diretórios que começam com abc.
greatvovan 11/04
42

Você pode usar o findcomando para procurar arquivos com padrão

find . -type f -name "abc*" 

O comando acima pesquisará o arquivo que começa com abc no diretório de trabalho atual.

-name 'abc'listará os arquivos que correspondem exatamente. Por exemplo: abc

Você também pode usar

 -iname
 -regex 

opção com o findcomando para pesquisar o nome do arquivo usando um padrão

devav2
fonte
7

Existem várias maneiras de fazer isso, dependendo exatamente do que você deseja fazer com elas. Geralmente, se você quiser apenas listá-las, poderá fazê-lo em um terminal usando:

find | grep '^\./ABC'

... e substituindo ABCpelo seu texto.

Para entender o comando, vamos dividir um pouco:

  • findlista todos os arquivos no diretório atual e seus subdiretórios; usá-lo sozinho irá listar tudo o que estiver lá. Observe que findgera cada arquivo ou diretório começando com ./, indicando que seu caminho é relativo ao diretório atual. Estar ciente disso é importante porque significa que procuraremos resultados começando com ./ABCe não apenas ABC.

  • O caractere de pipe |redireciona a saída de um comando para outro; nesse caso, a saída de findé redirecionada para grep. Isso é chamado de tubulação.

  • greppega a saída e a filtra usando o padrão fornecido ^\./ABC,.

    • Observe que o padrão é citado com aspas simples ' 'para impedir que o shell interprete os caracteres especiais dentro dele.
  • Agora, o próprio padrão é escrito em uma sintaxe específica chamada expressão regular , ou regex , abreviando . O Regex é uma ferramenta de pesquisa extremamente poderosa, se você o dominar, e existem sites como este que o ensinam com mais profundidade, mas observe que esse grepnão é um mecanismo de regex completo e você não pode fazer tudo com ele.

  • Para o nosso propósito:

    • ^em regex corresponde ao início da string; isso evita que ele corresponda ao padrão, se não ocorrer no início do nome do arquivo.

    • .em regex também tem um significado especial: significa "corresponder a qualquer caractere único aqui". Caso você queira usá-lo como um ponto literal, será necessário "escapá-lo" usando uma barra invertida \antes dele. (Sim, combinar qualquer personagem seria inofensivo no nosso caso, mas eu fiz isso por uma questão de perfeição.)

Yamaho
fonte
1
Por que você teria find | grepquando findseus próprios recursos de correspondência de padrões perfeitamente bons?
Darael
3

você pode usar o GREP, acho que essa é a solução mais simples, provavelmente também adicione outros parâmetros de grep para tornar a correspondência mais precisa

tree | grep ABC
Tomáš Tibenský
fonte
2

Você pode procurar um padrão específico usando o gerenciador de arquivos do Nautilus e expressões regulares.

Para fazer isso, clique em Selecionar itens correspondentes no menu de engrenagem como abaixo (você também pode pressionar Ctrl+ s).

insira a descrição da imagem aqui

Em seguida, basta digitar a expressão regular ABC* e validar.

insira a descrição da imagem aqui

Todo arquivo cujo nome corresponde ao seu padrão será selecionado automaticamente.

insira a descrição da imagem aqui

Estou usando o Nautilus 3.6. * Do GNOME3 PPA no Ubuntu 12.10 (Quantal).

remjg
fonte
1

A solução mais fácil para mim

ls | grep PATTERN

Aqui você pode dar qualquer expressão regular no PATTERN.

Por exemplo, para encontrar arquivos com "ab" em qualquer lugar dentro de seu nome, digite

ls | grep ".*ab.*"

Para localizar os arquivos começando com "ab", digite

ls | grep "^ab"
Preetom Saha Arko
fonte
1

Se você não souber o diretório em que os ABC*arquivos estão localizados e tiver milhões de arquivos, o locatecomando é o método mais rápido.

$ locate /ABC
/mnt/clone/home/rick/.cache/mozilla/firefox/9fu0cuql.default/cache2/entries/ABC6AD2FEC16465049B48D39FD2FE538258F2A34
/mnt/clone/home/rick/.cache/mozilla/firefox/9fu0cuql.default/cache2/entries/ABCBFDA54262F47253F95ED6ED4131A465EE0E39
/mnt/clone/usr/src/linux-headers-5.0.1-050001/tools/lib/lockdep/tests/ABCABC.sh
/mnt/clone/usr/src/linux-headers-5.0.1-050001/tools/lib/lockdep/tests/ABCDBCDA.sh
/mnt/clone/usr/src/linux-headers-5.0.1-050001/tools/lib/lockdep/tests/ABCDBDDA.sh
/mnt/old/home/rick/.cache/mozilla/firefox/3vkvi6ov.default/cache2/entries/ABC0C99FCEABAD0C6AA2078CD025A1CDE48D7BA1
/usr/src/linux-headers-5.0.1-050001/tools/lib/lockdep/tests/ABCABC.sh
/usr/src/linux-headers-5.0.1-050001/tools/lib/lockdep/tests/ABCDBCDA.sh
/usr/src/linux-headers-5.0.1-050001/tools/lib/lockdep/tests/ABCDBDDA.sh

Notas:

  • O comando acima leva 1 segundo para executar em 1 milhão de arquivos.
  • Em comparação, o findcomando que começa no /diretório raiz demora muito e gera muitos erros de permissão.
  • Se os arquivos foram criados hoje, você deve executar sudo updatedbprimeiro.
WinEunuuchs2Unix
fonte
0

eu uso

ls | grep abc

ou

ls -la | grep abc

Ele mostra todos os arquivos com abc, não apenas começando com abc. Mas, é uma maneira muito fácil para mim fazer isso.

Mariano Cali
fonte
0

Pitão:

$ python -c 'import sys,os;found=[os.path.join(r,i) for r,s,f in os.walk(".") for i in f if i.startswith("ABC")];map(lambda x: sys.stdout.write(x+"\n") ,found)'

Perl:

$ perl -le 'use File::Find;find(sub{ -f && $_ =~/^ABC/ && print $File::Find::name  },".")' 
Sergiy Kolodyazhnyy
fonte
0
printf "%s" /path/to/files/ABC*

É a correspondência de padrões globais, ancorada nas duas extremidades. Isso corresponderá a todas as ocorrências de arquivos que começam com "ABC", como "ABC", "ABC.txt", "ABC123", mas não com "xABC". Na linha de comando, usando 'ls' no lugar de 'printf', existe uma alternativa segura, porém, dependendo da opinião de quem você concorda, 'ls' não é seguro para uso em um script. Nesse caso, usar 'printf' com correspondência de padrões glob é considerado seguro. Se você usar isso em um script, a saída de 'printf' não conterá um novo caractere de linha até o final do fluxo de saída, como tal:

printf "%s" /path/to/files/ABC*  

Devoluções:

/path/to/files/ABC /path/to/files/ABC123

Se você precisar de quebras de linha após cada instância:

printf "%s\n" /path/to/files/ABC*

Devoluções:

/path/to/files/ABC 

/path/to/files/ABC123

"/ caminho / para / arquivos /" permanece na saída se você a inseriu dessa maneira ao executar o comando 'printf'. Sem ele, apenas o nome do arquivo aparece:

printf "%s" ABC* 

Devoluções

ABC ABC123

Supondo que você execute o comando no diretório em que os arquivos existem.

EnterUserNameHere
fonte
Não echo /path/to/files/ABC* | tr " " "\n"é uma boa ideia. Considere se existe um arquivo /path/to/files/ABC EFG, há um espaço no nome do arquivo. Você trdividirá o nome do arquivo em duas linhas separadas, o que não é bom. Pior ainda, se houver vários espaços no nome do arquivo. Eu recomendo que você use printf "%s\n" ABC*em vez disso, o que deve ajudar com espaços nos nomes de arquivos, mas ainda é problemático com outros caracteres especiais como\n
Sergiy Kolodyazhnyy
0

Command-t em um dos meus plugins favoritos do vim, é um plugin baseado em rubi acima da integração com o FZF.

Usando Comamnd-T e FZF, você pode fazer a pesquisa com um mecanismo "difuso" extremamente rápido para:

  • Abrindo arquivos e buffers
  • Saltando para tags e ajuda
  • Executando comandos ou pesquisas e comandos anteriores
  • com um número mínimo de teclas.

Como você pode ver

insira a descrição da imagem aqui

Eu sempre procuro no histórico de comandos abrindo um novo terminal e pressione:

CTRL+R

Além de procurar em todas as pastas recursivamente, escrevendo em qualquer guia do terminal:

fzf

Então inicie o seu nome de arquivo

ABC

Além disso, você pode escrever dentro vim

:CommandT 

Realmente útil, especialmente em pastas grandes.

HMagdy
fonte
0

Suponha que eu esteja no diretório raiz e deseje apenas a lista do diretório etc: escrevemos,

find -type d -name "etc"

resultado que obtemos,

[root@unix /]# find -type d -name "etc"

./etc
./usr/lib/firefox/bundled/etc
./usr/lib/unix-yarn/etc
./usr/lib/unix/etc
./usr/lib/festival/etc
./usr/bin/lib/vmware-tools/lib64/libconf/etc
./usr/bin/lib/vmware-tools/lib32/libconf/etc
./usr/etc
./usr/share/doc/oddjob-0.30/sample/etc
./usr/share/festival/lib/etc
./usr/local/etc
./usr/java/jdk1.7.0_25/lib/visualvm/etc
./home/user1/Desktop/VMware Tools/vmware-tools-distrib/lib/lib64/libconf/etc
./home/user1/Desktop/VMware Tools/vmware-tools-distrib/lib/lib32/libconf/etc
./home/user1/Desktop/VMware Tools/vmware-tools-distrib/etc
./home/user1/Desktop/VMware Tools/vmware-tools-distrib/caf/etc

Outro exemplo,

Também podemos escrever:

ls | grep "etc"

Nós temos,

etc
Bhaskar Das
fonte