Encontre arquivos pelo tamanho do nome do arquivo


10

Eu quero encontrar todos os arquivos pelo tamanho dos nomes dos arquivos.

Por exemplo, se eu quiser encontrar arquivos de comprimento 1, tais como a.go, b.go.

Eu coloco:

grep '.\{1\}' file

Mas isso não funciona. Que comando posso usar para encontrar arquivos pelo tamanho do nome do arquivo?


a.goé um nome de arquivo de comprimento 4. aé um nome de arquivo de comprimento 1. Esse é o Unix, não o DOS, onde o nome e a extensão estavam separados e um implícito .sempre fazia parte do nome do arquivo.
Peter Cordes

Respostas:


3

grepprocura padrões no conteúdo dos arquivos. Se você quiser ver os nomes dos arquivos, basta usar um shell glob (se quiser considerar apenas os nomes de arquivos no diretório atual):

echo ?.go

(A propósito, é o shell que avalia a glob, não o echocomando.)

Se você deseja procurar nos diretórios recursivamente, começando com o diretório atual, a ferramenta a ser usada é find:

find . -name '?.go'

(Observe que você deve citar o padrão para impedir que o shell o avalie como um globo antes de findser chamado.)


1
Também encontrará diretórios que também correspondem ao padrão '? .Go'.
Slm

@slm, os diretórios são um dos muitos tipos de arquivos, o OP não especificou que tipo de arquivo ele procurava.
Stéphane Chazelas

8

Se você apenas deseja encontrar os nomes de arquivos, pode usar o seguinte comando:

find -exec basename '{}' ';' | egrep '^.{100,}$'

Isso será executado find, retirando o nome do arquivo ou diretório usando basenamee, em seguida, procure qualquer nome de arquivo ou diretório com pelo menos 100 caracteres. Se você quiser encontrar um nome de arquivo com o tamanho exato, use em {100}vez de {100,}.

Se você deseja encontrar os nomes de arquivos, incluindo o caminho, faça o seguinte:

find | egrep '/[^/]{100,}$'

Isso retornará o nome do arquivo, incluindo o caminho relativo para onde você executou o comando find.


3

Primeiro de tudo, greppesquisa no conteúdo dos arquivos, não procura nomes de arquivos. Para isso você quer find. Ele não tem uma opção para definir o tamanho do nome do arquivo, mas você pode analisá-lo para obter o que deseja. Aqui estão alguns exemplos que eu executo em um diretório que contém os seguintes arquivos:

$ tree
.
├── a
├── ab
├── abc
├── abcd
└── dir
    ├── a
    ├── ab
    ├── abc
    └── abcd

A busca por arquivos nesse diretório retorna:

$ find . -type f | sort
./a
./ab
./abc
./abcd
./dir/a
./dir/ab
./dir/abc
./dir/abcd

Portanto, para encontrar os arquivos com um comprimento X, precisaremos remover o caminho e corresponder apenas aos caracteres após o último /:

 $ find . -type f | grep -P '/.{3}$'

O sedcomando apenas remove o ./. O -Psinalizador ativa expressões regulares compatíveis com Perl, necessárias para o {n}que é uma coisa PCRE e os $meios "coincidem com o final da string".

Você também pode simplesmente fazer isso:

find . -type f | grep -P '/...$'

Isso é bom para pequenos números digitando 15 pontos para coincidir com nomes de arquivos com comprimento 15 não é muito eficiente.

Por fim, se você deseja ignorar a extensão e corresponder apenas ao nome do arquivo, faça o seguinte (como sugerido pelo @slm):

find . -type f | grep -P '/.{1}\.'

No entanto, isso também encontrará arquivos como a.bo.go. É melhor se seus nomes de arquivos puderem conter mais de um .:

find . -type f | grep -P '/.{1}\.[^.]+$'

NOTA: A solução acima pressupõe que você tenha nomes de arquivos relativamente sãos que não contenham novos caracteres de linha etc. Também será considerado não ignorar espaços nos nomes de arquivos ao calcular o comprimento que pode não ser o desejado. Se algum destes problemas for um problema, informe-me e atualizarei minha resposta.


1

Você não especifica, mas se os arquivos estiverem em uma estrutura de diretórios, poderá usar findpara localizar arquivos com o comprimento 1, com a ajuda de grep:

$ find . -type f  | grep -P '/.{1}\.'

Exemplo

$ find . -type f  | grep -P '/.{1}\.' | head -10
./util-linux-2.19/include/c.h
./88366/a.bash
./89186/a.bash
./89563/b.txt
./89563/a.txt
./89563/c.txt
./89563/d.txt
./91734/2.c
./91734/4.c
./91734/1.c

No MacOS X, o uso egrep e remover a opção -P
Bart Kummel

@BartKummel - na verdade no OSX eu uso ggrep: heystephenwood.com/2013/09/install-gnu-grep-on-mac-osx.html . Perceba também que este Q não foi marcado como OSX, portanto, o uso de grepé adequado.
slm

1

Eu usaria algo assim.

find . -type f -name "?.go"

Então, se você colocar dois "?" então você está procurando nomes de arquivos com dois caracteres e a extensão.


0

Quando você deseja usar a expressão regular no comando find, use ""como:

find /var/log -iname "*.err" 

para o seu caso, use:

find yourpath -type f -a -name "?.go"

Você deve substituir seu caminho real por yourpath, -asignifica And -type fsignifica que você está procurando apenas arquivos regulares.

? na sua consulta significa um caractere como o DOS, se você se lembra.


-1

ls ?.* deve fornecer os resultados desejados.


bem-vindo ao Unix.SE. Infelizmente, não é útil adicionar respostas a perguntas antigas que já têm muitas boas respostas. (A menos que haja uma nova maneira melhor de resolver um problema antigo ou você tenha uma solução melhor do que qualquer uma das respostas antigas.) Se você quiser responder a algumas perguntas, consulte as novas na primeira página.
Peter Cordes
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.