Selecione um intervalo de logs dos arquivos de log diários

2

Eu tenho uma pasta contendo registros diários, nomeada como:

system-2013-01-01.log
system-2013-01-02.log
system-2013-01-03.log
system-2013-01-04.log
system-2013-01-05.log
system-2013-01-06.log
system-2013-01-07.log
system-2013-01-08.log
...
system-2013-01-31.log

Como posso selecionar (e copiar) os registros de 01/01/2013 a 01/01/2013?

    
por Raptor 04.02.2013 / 04:02

2 respostas

2

bash suporta expansão de contraventores , que permite especificar vários valores, ou até mesmo intervalos, para ser expandido em um comando. Por exemplo,

$ echo {1..5}
1 2 3 4 5
$ echo foo_{01..05}
foo_01 foo_02 foo_03 foo_04 foo_05

Assim, você pode especificar facilmente o intervalo de arquivos para copiar como

cp system-2013-01-{01..31}.log /some/destination/dir

qual bash será expandido para

cp system-2013-01-01.log system-2013-01-02.log system-2013-01-03.log ...
    
por 04.02.2013 / 04:18
1

Se você tiver um arquivo para todos os dias, poderá usar uma expressão de sequência em chaves :

cp -p system-2013-01-{01..15}.log /elsewhere

Se você não tiver um arquivo para todos os dias, use os padrões de caracteres. .

cp -p system-2013-01-0[1-9].log system-2013-01-1[0-5].log /elsewhere

Se não houver nenhum arquivo correspondente em um dos dois intervalos, o padrão não será expandido. Defina a opção nullglob (bash-specific) para evitar isso ( shopt nullglob ).

O Zsh torna isso mais fácil graças ao seu intervalo numérico <start-stop> padrão glob .

cp -p system-2013-01-<1-15>.log /elsewhere

Uma abordagem diferente que não requer zsh e escala bem para casos mais complexos é usar find para gerar a lista de arquivos. Você não precisa se preocupar com não-correspondências: cp será executado para cada partida.

find . \( -name 'system-2013-01-0[1-9].log' -o -name 'system-2013-01-1[0-5].log' \) -exec cp -p {} /elsewhere \;

Adicione -type d -prune -o após find . para evitar recursão em subdiretórios.

    
por 05.02.2013 / 01:23