免责声明:是的,在脚本中查找文件ls
是不好的,但find
不能按修改日期排序。
使用ls
andxargs
与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
是一个 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)
这些都不会处理奇怪的文件名,例如带有嵌入空格的文件名。