tar reclama “Nenhum tal arquivo ou diretório”

1

Estou usando o bash no Windows (distribuído junto com msysgit) para compactar arquivos de log - um arquivo por data. O problema é que seguir script não funciona e não tenho idéia do porquê. Cut está aqui para obter parte do nome do arquivo que corresponde a uma data em que o log foi gravado.

find . -type f -name '*.log' | cut -c3-12 | head -n 5 | xargs -I common printf "%s%s\n" common "*.log" | xargs -I fg tar cvzf hello.tgz fg

Antes da última etapa, cada linha se parece com isso - 2014-07-04 * .log
No último passo, isso me dá uma saída assim:

tar: 2014-07-01*.log: Cannot stat: No such file or directory

Eu suspeito que seja por causa de uma nova linha no final, porque quando eu chamo o comando tar manualmente ele funciona bem. Alguma idéia do que eu perdi? Eu li algumas das respostas similares, mas elas não parecem se aplicar no meu caso. O nome do arquivo é, por exemplo, mais tarde eu tornaria mais descritivo.

    
por chester89 27.12.2014 / 16:16

1 resposta

2

O problema é esta parte:

xargs -I common printf "%s%s\n" common "*.log"

O *.log é inserido no modelo como é . Eu não entendo porque você coloca o "*" lá. Isso resolveria isso:

xargs -I common printf "%s%s\n" common .log

No entanto, o último comando tar não funcionará, porque o comando tar cvzf hello.tgz fg será executado para cada arquivo, e, portanto, você acabará com um tar com um único arquivo (o último).

Acredito que isso deve estar mais próximo do que você deseja:

find . -type f -name '*.log' | cut -c3-12 | uniq | xargs -I{} sh -c 'tar zcvf {}.tgz {}*.log'

Se você tiver arquivos como:

2014-07-01.1.log
2014-07-01.2.log
2014-07-02.1.log
2014-07-02.5.log
2014-07-02.6.log

Em seguida, o comando colocará os dois primeiros em 2014-07-01.tgz e os três últimos em 2014-07-02.tgz .

    
por 27.12.2014 / 16:28