【问题标题】:zcat a file, output its contents to another file based on original filenamezcat 一个文件,根据原始文件名将其内容输出到另一个文件
【发布时间】:2013-08-31 22:09:15
【问题描述】:

我希望在 Linux 中创建一个 bash/perl 脚本,它将根据文件名恢复 .gz 文件:

_path_to_file.txt.gz
_path_to_another_file.conf.gz

下划线构成目录结构的地方......所以上面的两个将是:

/path/to/file.txt
/path/to/another/file.conf

这些都在/backup/目录下..

我想编写一个脚本,通过将 _ 更改为 / 以找到正确的路径,将每个 .gz 文件放到正确的位置 - 以便 _path_to_another_file.conf.gz 的内容替换 /path/to 中的文本/another/file.conf

zcat _path_to_another_file.conf.gz > /path/to/another/file.conf

我首先创建了一个包含正确目标文件名的文件。我可以创建另一个文件来列出其中的原始文件名并让脚本逐行执行?

ls /backup/ |grep .gz > /backup/backup_files && sed -i 's,_,\/,g' /backup/backup_files && cat /backup/backup_files

你怎么想?

【问题讨论】:

  • 阿罗哈,抢! StackOverflow 是一个很棒的网站。如果您通过搜索栏阅读此页面顶部的“关于”页面,您将获得一个徽章。

标签: backup gzip zcat


【解决方案1】:

这是一个 Bash 脚本,应该可以满足您的要求:

#!/bin/bash
for f in *.gz; do
    n=$(echo $f | tr _ /)
    zcat $f > ${n%.*}
done

它遍历所有以 .gz 结尾的文件,并将它们提取到文件名表示的路径中,并将 _ 替换为 /

【讨论】:

  • 谢谢!尝试了第一个版本并拥有.gz ..所以我打算将其切断..然后看到您对其进行了更新..这个当前版本将一个名为 ${n%.*} 的文件写入备份目录中..
  • 很抱歉,我没有在我这边测试它......不过这个应该可以工作,删除了 ${n%.*} 周围的引号。
【解决方案2】:

这不一定是可逆映射(例如,如果原始文件命名为 high_scores 怎么办?是专门编码的吗,例如,用双下划线作为 high__scores.gz?)但是如果你只是想取一个名字并翻译_/ 并在最后删除 .gzsed 会这样做:

for name in /backup/*.gz; do
    newname=$(echo "$name" |
        sed -e 's,^/backup/,,' \
            -e 's,_,/,g' \
            -e 's/\.gz$//')
    echo "zcat $name > $newname"
done

确保它工作正常(以上完全未经测试!)然后取出回声,离开:

    zcat "$name" > "$newname"

(引号防止名称中出现空格)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-12
    • 1970-01-01
    • 1970-01-01
    • 2020-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多