从 tar 存档中删除文件

FUZ*_*xxl 19 tar

我有一个foo.tar.xz包含很多(比如 200000)个文件的大文件。我发现这个档案包含一些我不想要的(大约 5000 个)文件。我没有足够的磁盘空间将整个内容解压缩到我的磁盘上;此外,如果我这样做,我担心属性/权利可能会丢失。不过,我有足够的空间来托管压缩存档的两个副本。是否有工具可以即时从存档中删除某些文件(在文件名中使用正则表达式指定),即无需将存档解压缩到单个文件中?

Evi*_*ine 22

GNU tar 现在也有一个--delete可以处理档案的选项。

像这样使用它,例如:

tar -vf yourArchive.tar --delete your/path/to/delete
Run Code Online (Sandbox Code Playgroud)

当心:它很可能不适用于任何类型的磁带介质。但是tar在管道中工作没有问题,所以你可以只使用一个临时的 tar 文件,然后用它覆盖磁带。它也不适用于压缩文件,因此您需要解压缩文件。

此外,由于 tar 档案的(按设计)打包线性特性,在任何情况下操作都会相当慢。

  • @FUZxxl `-T` 与 `--delete` 一起使用,并且 `--wildcards` 允许您使用模式而不是文件名,因此创建一个包含模式的临时文件并使用 `unxz < file.tar.xz | tar --wildcards --delete -T 模式文件 | xz > file2.tar.xz`。它不会执行完整的正则表达式(如果需要,只需使用`tar -t` 并建立要删除的文件名列表),只会执行文件名匹配模式。 (5认同)

fro*_*utz 14

(编辑,因为我误解了这个问题,后来也被编辑了)

您能做的最好的事情是提取、删除和重新压缩整个文件。

unxz < foobar-old.tar.xz | tar --delete foo/bar | xz > foobar-new.tar.xz

无法直接从 tar 中删除文件。

tar 是一个流,最初用于不能很好地进行随机搜索的磁带驱动器 - 虽然理论上它可以在磁盘文件系统上打一个洞/重写剩余的文件,压缩这一点是没有意义的,如果不是全部的话压缩方法严重依赖于文件中较早出现的内容。为了就地执行此操作,您需要非常详细地了解压缩方法和 tar 文件格式。这复杂到没有人会打扰它的地步。保留文件并忽略它们更便宜。

如果您需要此功能,tar 可能不是您想要的。