3

我希望在 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/ 中的文本文件.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

怎么想?

4

2 回答 2

3

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

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

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

于 2013-08-28T17:45:42.293 回答
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"

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

于 2013-08-28T17:47:20.703 回答