ls | grep regex, ignorar arquivos com .tab,

1

Eu sei regex, mas não sei como fazer isso funcionar. Eu quero listar todos os arquivos que não possuem .tab. e não tem ~ no final do nome do arquivo e não é um .o (ou .bin)

Eu posso listar todos os arquivos que possuem .tab. escrevendo

ls | grep .tab.

No entanto, não consigo descobrir como ignorar esses arquivos e listar todo o resto. Eu tentei

ls | grep [^(.tab.)]

mas recebeu um erro e achou que meu regex final seria

ls | grep ([^(.tab.)]|.o$|.bin$)

Mas eu nunca fiz muito regex, então tenho certeza que a final está errada mesmo que a sintaxe esteja certa.

    
por Dennis Williamson 23.10.2009 / 14:20

4 respostas

3

Como eu faria isso dependeria do contexto. Se isso não fosse por um script, e eu só queria ver isso, eu estaria bem com o uso de ls:

ls -a | egrep -v '(tab|\.o$|\.bin$|~$)'

Se em um script, eu usaria um loop:

for file in *; do
#file $file in .* *; do   -- To Include dot (hidden files)                     
   if ! egrep -q '(tab|\.o$|\.bin$|~$)' <<<$file; then
      echo $file
   fi
done

Você pode adicionar outro se testar com -f se quiser apenas arquivos regulares e não diretórios. Se você quiser fazer isso recursivamente, você pode usar o GNU find com um teste -regex e posix-egrep. Mas leve em consideração o fato de que esse regex corresponderá ao caminho completo em relação ao diretório em que você pesquisou.

Outra boa opção são extensões estendidas se você tiver suporte para isso, veja a resposta de Dennis.

    
por 23.10.2009 / 14:55
1

A opção -v / --invert-match faz com que as linhas de saída do grep correspondam a não . Então:

ls | grep -v .tab.

ou

ls | grep --invert-match .tab.

no seu caso.

    
por 23.10.2009 / 14:45
1
shopt -s extglob
ls -l !(*.bin|*.o|*~|*.tab.*)
    
por 23.10.2009 / 14:45
0

ls | egrep -v (.tab|.o$|.bin$)

deve fazer isso. egrep é basicamente grep -E, que suporta regex 'estendido', então coisas como (x | y) funcionam.

    
por 23.10.2009 / 14:44

Tags