如何通过 UNIX 替换 tar 文件中存在的文件字符串

如何通过 UNIX 替换 tar 文件中存在的文件字符串

我有一个 tar 存档 xyz.tar,其中包含许多 .sh 文件,例如:

123.sh
456.sh
789.sh

每个.sh文件都有一些字符串内容,例如123.sh包含欢迎来到好莱坞,456.sh包含我爱好莱坞,并789.sh包含好莱坞电影。

.sh现在,我的目标是使用循环在所有文件中用 Oscar 替换字符串 Hollywood 。

我尝试了这个命令:

for i in $(tar -xvf xyz.tar); do sed -e 's/Hollywood/Oscar/' $i; done

我在命令窗口上得到输出,但 o/p 没有反映在 xyz.tar 存档中,因为在提取和替换命令后无法重新压缩 tar 存档。

答案1

首先,您应该意识到 .tar 文件通常不会被压缩(如果它被压缩.tar.gz,则更可能有一个扩展名.tar.xz)。

然后你tar -xvf xyz.tar提取文件列出名称,sed 适用于文件名列表,甚至不适用文件内容。

如果您的替换长度与原始文件完全相同,那么理论上您可以(因为 tar 文件没有校验和)替换.tar.然而更好的方法是首先提取临时目录中的所有文件,然后使用

find . -name "*.sh" -print0 | xargs -0 sed -i -e 's/Hollywood/Oscar/'

然后从该临时目录重新创建 tar 文件。

这假设您sed支持-i(用编辑的内容替换输入文件),如果不支持,您应该制作一个小脚本来调用并将输出写入临时文件,然后在完成sed时将文件复制回来。sed

相关内容