zcat一个文件,根据原始文件名将其内容输出到另一个文件

时间:2013-08-28 17:36:26

标签: backup gzip zcat

我想在Linux中创建一个基于文件名恢复.gz文件的bash / perl脚本:

_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 /中的文本/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

怎么想?

2 个答案:

答案 0 :(得分:2)

这是一个应该做你想做的Bash脚本:

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

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

答案 1 :(得分: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"

(引号可以防止名称中的空格。)