Localiza arquivos pelo comprimento do nome do arquivo

8

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

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

eu coloquei:

grep '.\{1\}' file

Mas isso não funciona. Qual comando posso usar para encontrar arquivos por tamanho de nome de arquivo?

    
por EPSILONsdfsdfdsf 01.10.2013 / 05:47

7 respostas

3

grep procura padrões no conteúdo dos arquivos. Se você quiser olhar para os nomes dos arquivos, você pode simplesmente usar um shell glob (se você quiser considerar apenas nomes de arquivos no diretório atual):

echo ?.go

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

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

find . -name '?.go'

(Note que você tem que citar o padrão para evitar que o shell o avalie como um glob antes de find ser chamado.)

    
por 01.10.2013 / 06:14
6

Se você quiser apenas encontrar os nomes dos arquivos, você pode usar o seguinte comando:

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

Isso executará find , retirando o nome do arquivo ou diretório usando basename e, em seguida, procurará qualquer nome de arquivo ou diretório com pelo menos 100 caracteres. Se você quisesse encontrar um nome de arquivo de um tamanho exato, use {100} em vez de {100,} .

Se você quiser encontrar os nomes dos 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.

    
por 12.03.2017 / 02:23
2

Em primeiro lugar, grep pesquisa através do conteúdo dos arquivos, ele não procurará por nomes de arquivos. Para isso você quer find . Ele não tem uma opção para definir o comprimento do nome do arquivo, mas você pode analisar sua saída para obter o que deseja. Aqui estão alguns exemplos que eu executo em um diretório contendo os seguintes arquivos:

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

A pesquisa por arquivos neste 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 de X, precisaremos remover o caminho e corresponder apenas aos caracteres após o último / :

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

O comando sed apenas remove o ./ . O -P flag ativa Perl Compatible Regular Expressions que são necessárias para {n} , que é uma coisa PCRE e o $ significa "corresponde ao final da string".

Você também pode simplesmente fazer isso:

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

Isso é bom para números pequenos. A digitação de 15 pontos para corresponder nomes de arquivo de tamanho 15 não é muito eficiente.

Finalmente, se você quiser ignorar a extensão e corresponder apenas ao nome do arquivo, faça isso (como sugerido @slm):

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

No entanto, isso também encontrará arquivos como a.bo.go . Isso é 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 sadios que não contenham novos caracteres de linha, etc. Ele também contará não ignorar espaços em nomes de arquivos ao calcular o comprimento que pode não ser o que você deseja. Se qualquer um deles for um problema, avise-me e atualizarei minha resposta.

    
por 01.10.2013 / 06:14
1

Você não especifica, mas se os arquivos estiverem dentro de uma estrutura de diretório, você pode usar find para localizar arquivos de 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
    
por 01.10.2013 / 06:15
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.

    
por 01.10.2013 / 06:27
0

Quando você quiser usar exxpression regular no comando find, você deve usar "" como:

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

para uso de maiúsculas e minúsculas:

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

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

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

    
por 01.10.2013 / 10:17
-1

ls ?.* deve fornecer os resultados desejados.

    
por 15.08.2015 / 22:12