【问题标题】:zcat filename expansion in for loopfor循环中的zcat文件名扩展
【发布时间】:2014-02-05 02:19:15
【问题描述】:

我得到了这些文件:

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 的这种行为。 谢谢!

【问题讨论】:

  • 您使用的是哪个版本的zcatzcat --version
  • 版本为:zcat 1.3.5

标签: bash unix zcat


【解决方案1】:

我试过你的脚本,没有问题,但是如果我设置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

【讨论】:

  • 谢谢 *.txt.gz 工作正常。我提到顺便说一句,我知道 zgrep 会起作用,但我只是想了解发生了什么。
  • 我更新了我的答案,请检查你的ls是否有别名--color=always
  • 尝试ls *.txt.gz | cat -A查看ls正在输出的隐藏字符。
  • 确实如此。 alias ls='ls --color'。这搞砸了。使用\ls 它正在工作。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-07
  • 1970-01-01
  • 2011-07-03
  • 2016-07-23
  • 1970-01-01
  • 1970-01-01
  • 2010-10-13
相关资源
最近更新 更多