Расширение имени файла 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
Другие вопросы по тегам