filtrando arquivos da pesquisa

0

Eu tenho alguns arquivos contendo data e timestamp que desejo excluir da saída de ls como em:

 test.log.15-05-25_20:41:05.20150611
 test.log.15-05-27_20:28:32.20150611
 test.log.15-05-26_20:29:40.20150611
 test.log.
 test-file~df_gp~1.log.
 test.log.20150616
 test.log.15-05-28_20:28:27.20150616
 test.log.15-05-27_20:28:32.20150616
 test.log.15-05-26_20:29:40.20150616
 test.log.15-05-25_20:41:05.20150616
 test-bat-test.log.

e a saída deve listar apenas os arquivos abaixo, o que significa que qualquer arquivo contendo data e timestamp deve ser omitido

 test.log.
 test-file~df_gp~1.log.
 test-bat-test.log.

Existe uma maneira em que isso pode ser feito?

    
por user68112 16.06.2015 / 19:34

2 respostas

1

Você pode usar o GNU find :

 find * -regextype posix-extended \! -regex '.*[0-9]{8}.*' -prune

Se a data estiver sempre no final da sequência e precedida por . , você também poderá usar o regex .*\.[0-9]{8} , o que refletiria isso e reduziria o risco de arquivos excluídos incorretamente.

Como funciona:

  • -regextype posix-extended seleciona um tipo de regex adequado para o regex abaixo
  • \! nega o significado da declaração que segue
  • -regex '.*[0-9]{8}.*' corresponde a qualquer arquivo que tenha oito dígitos consecutivos (isto é, uma data do formulário 20150616 )
  • -prune impede que find liste os subdiretórios

Outra opção:

  • Adicione a opção -f para listar apenas arquivos

EDITAR:

No AIX sem suporte para expressão regular em find , você poderia usar o seguinte (usando o mecanismo de globalização padrão):

find * \! -name '*[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]*' -prune

Ou, se a data estiver sempre no final da string e precedida por um . , o seguinte padrão poderá ser usado: *.[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]

EDIT 2:

Se você quiser que os arquivos comecem com test , use:

find * -prune -type f \! -name 'test*.[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'

Se você não quiser usar a expansão de nome de arquivo pelo shell e não tiver um diretório adicional nesse diretório, também poderá usar:

find . -type f \! -name 'test*.[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
    
por 16.06.2015 / 19:50
0

Geralmente, uso | grep -v para filtrar as linhas que não quero. Se o grep não remover o suficiente, eu adiciono outro:

$ ls | grep -v 2015 |grep -v 2014

Isto é mais fácil do que ter que lembrar os parâmetros do regex posix para encontrar:)

    
por 16.06.2015 / 22:15