Расширение имени файла zcat в цикле for
Я получил эти файлы:
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. Спасибо!
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