我的CMS系统经常发布补丁程序。我希望能够直接在我的开发系统上的完整版本中提取包含最新版本的修补文件的tar文件。当我提取tar文件时,它将它放入一个名为tar文件的文件夹中。这让我手动将每个文件复制到主目录。有没有办法强制tar将文件解压缩到当前目录并覆盖具有相同文件名的任何文件?任何已经存在的目录都不应该被覆盖,而是合并......
这可能吗?如果是这样,命令是什么?
答案 0 :(得分:2)
查看tar的--strip-components(或--strippath)参数,可能就是你要找的。 p>
编辑:您可能希望将--keep-newer抛出混合,因此不会覆盖任何本地修改的文件。我建议在开发服务器上测试新版本,然后使用rsync或subversion来继续进行更改。
答案 1 :(得分:1)
我尝试让--strip-components工作,虽然我没有那么努力,但我没有让它工作。它使目录结构变得扁平化。在搜索中,我遇到了以下命令,似乎完全符合我的要求:
pax -r -f patch.tar -s'/ patch ///'
这不是焦油,但是,嘿,它的工作原理......用你的tar文件名替换“patch”。
答案 2 :(得分:0)
选项'--strip-components'允许您修剪部分嵌入的文件名。有了它,就可以做你想做的事。
如需更多帮助,请查看http://www.gnu.org/software/tar/manual/html_section/transform.html
答案 3 :(得分:0)
我刚刚完成了:
tar -xzf patch.tar.gz
它会覆盖补丁包含的所有文件。
即,如果为app
文件夹的内容创建了补丁,我会在那里提取它。结果将是这样的:
tar.gz contains: oldfolder/someoldfile.txt, oldfolder/newfolder/newfile.txt
在app看起来之前:
app/oldfolder/someoldfile.txt
之后,app看起来像
app/oldfolder/someoldfile.txt
oldfolder/newfolder/newfile.txt
“someoldfile.txt”实际上已更新为tar.gz中的内容
也许这不适用于常规tar,只有tar.gz.但我对此表示怀疑。我认为它应该适用于所有事情,只要用户具有写权限。