【发布时间】:2009-03-17 23:23:58
【问题描述】:
经常为我的 CMS 系统发布补丁。我希望能够直接在我的开发系统上的完整版本上提取包含最新版本的修补文件的 tar 文件。当我提取一个 tar 文件时,它会将其放入一个带有 tar 文件名称的文件夹中。这让我不得不手动将每个文件复制到主目录。有没有办法强制 tar 将文件提取到当前目录并覆盖任何具有相同文件名的文件?任何已经存在的目录都不应被覆盖,而应合并...
这可能吗?如果是这样,命令是什么?
【问题讨论】:
经常为我的 CMS 系统发布补丁。我希望能够直接在我的开发系统上的完整版本上提取包含最新版本的修补文件的 tar 文件。当我提取一个 tar 文件时,它会将其放入一个带有 tar 文件名称的文件夹中。这让我不得不手动将每个文件复制到主目录。有没有办法强制 tar 将文件提取到当前目录并覆盖任何具有相同文件名的文件?任何已经存在的目录都不应被覆盖,而应合并...
这可能吗?如果是这样,命令是什么?
【问题讨论】:
查看 tar 的 --strip-components(或 --strippath)参数,可能就是您要查找的内容。
编辑:您可能希望将 --keep-newer 加入其中,这样任何本地修改的文件都不会被覆盖。我建议在开发服务器上测试新版本,然后使用 rsync 或 subversion 进行更改。
【讨论】:
我尝试让 --strip-components 工作,虽然我没有那么努力,但我没有让它工作。它一直在扁平化目录结构。在搜索中,我遇到了以下命令,似乎完全符合我的要求:
pax -r -f patch.tar -s'/patch///'
它不是 tar,但是,嘿,它可以工作...用你的 tar 文件名替换“patch”这个词。
【讨论】:
“--strip-components”选项允许您修剪部分嵌入文件名。有了它,你就可以做你想做的事了。
如需更多帮助,请查看http://www.gnu.org/software/tar/manual/html_section/transform.html
【讨论】:
我刚刚做了:
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。但我对此表示怀疑。我认为它应该适用于一切,只要用户具有写入权限。
【讨论】: