我想在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
怎么想?
答案 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
?)但是如果你只是想要一个名称并将_
翻译为/
并在结尾处移除.gz
,sed
将会这样做:
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"
(引号可以防止名称中的空格。)