1

经常为我的 CMS 系统发布补丁。我希望能够直接在我的开发系统上的完整版本上提取包含最新版本的修补文件的 tar 文件。当我提取一个 tar 文件时,它会将其放入一个带有 tar 文件名称的文件夹中。这让我不得不手动将每个文件复制到主目录。有没有办法强制 tar 将文件提取到当前目录并覆盖任何具有相同文件名的文件?任何已经存在的目录都不应被覆盖,而应合并...

这可能吗?如果是这样,命令是什么?

4

4 回答 4

2

查看 tar 的 --strip-components(或 --strippath)参数,这可能是您正在寻找的。

编辑:您可能希望将 --keep-newer 加入其中,因此不会覆盖任何本地修改的文件。我建议在开发服务器上测试新版本,然后使用 rsync 或 subversion 来进行更改。

于 2009-03-17T23:27:34.887 回答
1

我尝试让 --strip-components 工作,虽然我没有那么努力,但我没有让它工作。它一直在扁平化目录结构。在搜索中,我遇到了以下命令,它似乎完全符合我的要求:

pax -r -f patch.tar -s'/patch///'

它不是 tar,但嘿,它可以工作......用你的 tar 文件名替换“patch”这个词。

于 2009-03-18T16:37:01.057 回答
0

选项“--strip-components”允许您修剪部分嵌入文件名。有了它,就可以做你想做的事。

如需更多帮助,请查看http://www.gnu.org/software/tar/manual/html_section/transform.html

于 2009-03-17T23:29:27.563 回答
0

我刚刚做了:

tar -xzf patch.tar.gz

它会覆盖补丁包含的所有文件。

即,如果为文件夹的内容创建了补丁app,我会在那里提取它。结果将是这样的:

tar.gz contains: oldfolder/someoldfile.txt, oldfolder/newfolder/newfile.txt

在应用看起来像之前:

app/oldfolder/someoldfile.txt

之后,应用看起来像

app/oldfolder/someoldfile.txt
oldfolder/newfolder/newfile.txt

而“someoldfile.txt”实际上已更新为 tar.gz 中的内容

也许这不适用于常规 tar,只有 tar.gz。但我对此表示怀疑。我认为它应该适用于一切,只要用户具有写权限。

于 2012-12-30T04:55:51.187 回答