Tentando usar o awk para fazer ls mostrar não-diretórios

1

Estou tentando mostrar a lista de todos os arquivos que não são diretórios. Eu digito ls -la | awk '$1 != "d*"' esperando que não mostre nenhuma string na primeira coluna que comece com d , mas não funciona como eu esperava. Onde está o meu erro?

    
por PanthersFan92 25.08.2016 / 12:54

3 respostas

2

!= é apenas uma comparação de cadeia (ou comparação de número, dependendo do que está sendo comparado) operador. Para comparação de string ( A != B ), dependendo da implementação de awk , é uma comparação byte a byte ou para alguns (conforme exigido pelo POSIX), é a abreviação de A < B || A > B , que é A != B testes se A e B ordenam de forma diferente.

Em qualquer caso, não é um operador de correspondência de padrões. Para isso, você tem o operador ~ (negado com !~ ), embora seja para correspondência de expressão regular, não para correspondência de padrão curinga. Você precisaria:

ls -la | awk '$1 !~ /^d/'

Embora aqui você também possa usar:

ls -la | grep -v '^d'

Com $1 != "d*" , isso retornaria verdadeiro para qualquer coisa, exceto um primeiro campo que é (ou ordena o mesmo que com awk implementaions) d* . d* como um regexp corresponde a qualquer número (incluindo 0) de d , portanto, $1 !~ "d*" sempre retornará false , pois qualquer string conteria no mínimo 0 d s.

    
por 25.08.2016 / 13:02
1

Tente isso ...

  $ls -la | awk '$1 !~ /[d].*/ '
                 or
  $ls -l | grep -v ^d
    
por 25.08.2016 / 13:04
1
  • Você deseja usar !~ em vez de != para corresponder à regex. %código%
  • Você não deseja analisar a saída de awk '$1 !~ /^d/ , pois é inerentemente frágil.
  • Se você está apenas procurando por não-diretórios, ls tem uma opção find que você pode usar (você deseja pesquisar em -type .
por 25.08.2016 / 13:04

Tags