我得到了这些文件:
bonds.txt.gz
bonds_201307.txt.gz
bonds_201308.txt.gz
bonds_201309.txt.gz
bonds_201310.txt.gz
bonds_201311.txt.gz
bonds_201312.txt.gz
我有一个for循环来遍历文件,解压缩它们,并找到一个带有grep:的字符串
for f in `ls *.txt.gz`; do echo $f; zcat $f | grep MYBOND; done
如果我运行这个,我会得到以下信息:
bonds.txt.gz
zcat: bonds.txt.gz.gz: No such file or directory
bonds_201307.txt.gz
zcat: bonds_201307.txt.gz.gz: No such file or directory
bonds_201308.txt.gz
zcat: bonds_201308.txt.gz.gz: No such file or directory
bonds_201309.txt.gz
zcat: bonds_201309.txt.gz.gz: No such file or directory
bonds_201310.txt.gz
zcat: bonds_201310.txt.gz.gz: No such file or directory
bonds_201311.txt.gz
zcat: bonds_201311.txt.gz.gz: No such file or directory
bonds_201312.txt.gz
zcat: bonds_201312.txt.gz.gz: No such file or directory
似乎zcat正在用一个额外的.gz扩展文件名然而,当我试图从命令行zcat一个文件时,它并没有做到这一点,只是选择了提供的文件名并完成了它的工作。为什么在循环中调用时会发生这种情况?
我知道我可以通过使用zgrep或find来实现同样的目的,但我仍然有兴趣了解zcat的这种行为。谢谢
我试过你的脚本,没有问题,但如果我设置alias ls='ls --color=always'
,我会有同样的问题
也许你的ls
会返回一些隐藏字符,比如颜色代码
你能试试吗
for f in `ls *.txt.gz`
但是你本可以用
for f in *.txt.gz
而非
for f in `ls *.txt.gz`
如果你的系统有zgrep
,你可以使用zgrep MYBOND $f
而不是zcat $f | grep MYBOND
代码如下:
for f in *.txt.gz; do echo "$f"; zgrep MYBOND "$f"; done