Procura por todos os arquivos contendo apenas uma string de um certo tamanho

4

Eu tenho muitos arquivos que estou procurando para encontrar os que contêm uma string de 8 caracteres - nada mais.

Até agora eu tentei: -

grep -x '.\{8,8\}'

Que está me mostrando arquivos que contêm uma sequência de exatamente 8 caracteres, mas também mostra arquivos que contêm muitas outras coisas, além dos 8 caracteres. Eu quero os arquivos que contêm uma string de exatamente 8 caracteres e nada mais.

Qualquer ajuda seria muito apreciada. Obrigado.

    
por crabsticks 22.05.2018 / 12:14

3 respostas

7

Você está procurando arquivos com 9 bytes de comprimento, oito caracteres e uma nova linha. Isso pressupõe que você esteja procurando somente caracteres de byte único.

find . -type f -size 9c -exec grep -l -E '^.{8}$' {} +

Isso encontra todos os arquivos regulares dentro ou abaixo do diretório atual com exatamente 9 bytes de comprimento. Para verificar se eles contêm apenas uma única linha, executamos grep sobre eles e tentamos corresponder uma linha com exatamente oito caracteres. Deixamos grep mostrar os nomes dos arquivos correspondentes com sua opção -l .

    
por 22.05.2018 / 12:17
5

Com o GNU awk para localizar arquivos regulares que contenham apenas uma linha, contendo exatamente 8 caracteres (sem contar o caractere de nova linha, se houver):

find . -type f -size +7c -size -50c -exec gawk '
  BEGINFILE               {p = 0}
  FNR == 1 && length == 8 {p = 1}
  FNR == 2                {p = 0; nextfile}
  ENDFILE                 {if (p) print FILENAME}' {} +

Com a localização, restringimos a arquivos cujo tamanho esteja entre 8 e 49 bytes. 8 para um arquivo com 8 caracteres de um byte e sem nova linha, 49 para 8 caracteres de 6 bytes (o máximo em UTF-8, você pode querer se adaptar a outros conjuntos de caracteres) e uma nova linha.

Ou com zsh :

has_one_line_of_8_characters() {
  local c
  ! read -ru0 -k10 c && [[ $c =~ $'^[^\n]{8}\n?$' ]]
} < ${1-$REPLY}

printf '%s\n' **/*(.DL+7L-50+has_one_line_of_8_characters)
    
por 22.05.2018 / 12:50
1
gawk '/^.{9}$/{print FILENAME}' RS='
$ tail -n +1 -- *
==> 11_chars <==
zzzzzzzzzz

==> 5_chars <==
zzzz

==> 7_chars <==
zzzzzz

==> 9_chars <==
zzzzzzzz
' *

Eu escolhi 9 caracteres, porque os 8 caracteres e o caractere de nova linha no final da linha = 9 caracteres no total. Se você precisa estritamente de 8 caracteres com a nova linha incluída, você deve usar o número 8 no padrão.

Teste

Eu tenho quatro arquivos na pasta de teste:

$ gawk '/^.{9}$/{print FILENAME}' RS='
gawk '/^.{9}$/{print FILENAME}' RS='
$ tail -n +1 -- *
==> 11_chars <==
zzzzzzzzzz

==> 5_chars <==
zzzz

==> 7_chars <==
zzzzzz

==> 9_chars <==
zzzzzzzz
' *
' * 9_chars

Saída

$ gawk '/^.{9}$/{print FILENAME}' RS='%pre%' *
9_chars
    
por 22.05.2018 / 19:58

Tags