A combinação de ls, xargs e zcat leva a sufixos de nome de arquivo duplicados?

0

Aviso de isenção de responsabilidade : Sim, localizar arquivos em um script com ls é ruim, mas find não pode classificar por data de modificação.

Usando ls e xargs com echo , tudo está bem:

$ ls -t1 ssl-access*.gz | xargs -n 1 echo
ssl-access.log.2.gz
ssl-access.log.3.gz
ssl-access.log.4.gz
[...]

Alterando echo para zcat :

$ ls -t1 ssl-access*.gz | xargs -n 1 zcat
gzip: ssl-access.log.2.gz.gz: No such file or directory
gzip: ssl-access.log.3.gz.gz: No such file or directory
gzip: ssl-access.log.4.gz.gz: No such file or directory
[...]

Sufixos de arquivos duplicados ?! O que está acontecendo aqui?

ATUALIZAÇÃO:

OS é o Debian 5.

zcat é um script de shell em /bin/zcat :

#!/bin/sh
PATH=${GZIP_BINDIR-'/bin'}:$PATH
exec gzip -cd "$@"
    
por Christoph Wurm 21.10.2011 / 22:41

2 respostas

4

Eu encontrei este problema no meu sistema causado pela cor ls. No meu .bash_profile, eu tive isto:

alias ls="ls --color"

Encontrei o resultado enviando-o para stat, que imprimia algo útil:

$ ls local4.notice-201207* | xargs -n1 -P4 -I{} stat {}
stat: cannot stat '3[0mlocal4.notice-20120711.gz3[0m': No such file or directory

Olhe para esses códigos de cor nulos! Foi confuso zcat, que tentou adicionar um sufixo .gz para encontrar um arquivo. O problema foi facilmente resolvido alterando-se ls para color = auto, o que desativa a saída de cores quando o STDOUT é colado a outro processo em vez de um terminal

alias ls="ls --color=auto"

Boa sorte!

    
por 28.08.2012 / 18:17
1

Você pode estar usando um sistema operacional em que zcat é para arquivos compactados, enquanto o gzcat é para arquivos compactados. Nesse caso, isso deve funcionar:

   ls -t ssl-access*.gz | xargs -n 1 gzcat

Editar:

Eu reproduzi um comportamento semelhante, mas não idêntico, no Solaris:

$ ls -t1 *.gz | xargs -n 1 zcat          
c.gz.Z: No such file or directory
b.gz.Z: No such file or directory
a.gz.Z: No such file or directory

Em uma distribuição baseada no Debian (Ubuntu), eu não reproduzo seu problema.

Isso pode funcionar de qualquer maneira:

cat $(ls -t ssl-access*.gz) | zcat

ou o equivalente:

zcat <(cat $(ls -t ssl-access*.gz))

ou este mais simples que evita um gato desnecessário

zcat $(ls -t ssl-access*.gz)

Nenhum deles irá lidar com nomes de arquivos estranhos como aqueles com espaços incorporados.

    
por 21.10.2011 / 22:51