ls、xargs 和 zcat 组合会导致文件名后缀重复?

ls、xargs 和 zcat 组合会导致文件名后缀重复?

免责声明:是的,在脚本中查找文件ls是不好的,但find不能按修改日期排序。

使用lsandxargsecho一切都很好:

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

更改echozcat

$ 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是一个 shell 脚本/bin/zcat

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

答案1

我在我的系统上发现这个问题是由 color 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"

祝你好运!

答案2

您可能使用的操作系统中 zcat 用于压缩文件,而 gzcat 用于 gzip 压缩文件。在这种情况下,这应该有效:

   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)

这些都不会处理奇怪的文件名,例如带有嵌入空格的文件名。

相关内容