Комбинация ls, xargs и zcat приводит к дублированию суффиксов имени файла?

Отказ от ответственности : Да, поиск файлов в скрипте с ls плох, но find не может сортировать по дате изменения.

Использование ls и xargs с echo все в порядке:

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

Изменение echo на 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 [...] 

Дублировать суффикс файла ?! Что здесь происходит?


ОБНОВИТЬ:

ОС – Debian 5.

zcat – это сценарий оболочки в /bin/zcat :

 #!/bin/sh PATH=${GZIP_BINDIR-'/bin'}:$PATH exec gzip -cd "$@" 

Я нашел эту проблему в своей системе, вызванной цветом ls. В моем .bash_profile у меня было:

 alias ls="ls --color" 

Я нашел результат, отправив его в stat, который напечатал что-то удобное:

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

Посмотрите на эти нулевые цветовые коды! Это запутало zcat, который попытался добавить суффикс .gz, чтобы найти файл. Проблема была легко решена путем изменения ls на color = auto, что отключает вывод цвета, когда STDOUT приклеивается к другому процессу, а не к терминалу

 alias ls="ls --color=auto" 

Удачи!

Возможно, вы используете ОС, где zcat предназначен для сжатых файлов, а gzcat – для gzipped. В таком случае это должно работать:

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

Редактировать:

Я воспроизвел аналогичное, но не тождественное поведение в 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 

В дистрибутиве на основе Debian (Ubuntu) я не воспроизвожу вашу проблему.

Это может работать в любом случае:

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

или эквивалент:

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

или этот более простой, который позволяет избежать ненужной кошки

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

Ни один из них не будет обрабатывать нечетные имена файлов, такие как те, которые имеют встроенные пространства.