从tar存档中删除文件


17

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

Answers:


15

--delete如今,GNU tar也具有与存档一起使用的选项。

像这样使用它,例如:

tar -vf yourArchive.tar --delete your/path/to/delete

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

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


1
它的确存在,但是不适用于无法进行随机访问的文件(例如压缩存档),但这是我的用例。
FUZxxl

1
另一个问题是我无法指定要删除的模式。请注意我在2013年发表的评论,其中我已经解决了的缺点gtar --delete
FUZxxl

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

14

(编辑,因为我误解了这个问题,自此以后也对其进行了编辑)

最好的办法是提取,删除和重新压缩整个文件。

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

无法直接从tar删除文件。

tar是一种流,最初是为不能随机查找的磁带驱动器而设计的-从理论上讲,它可以在磁盘文件系统上打一个洞/重写剩余的文件,而在压缩的情况下,该点几乎没有问题压缩方法在很大程度上取决于文件中较早出现的内容。为了做到这一点,您将需要有关压缩方法以及tar文件格式的非常详细的知识。如此复杂,以至于没有人会去理会它。只保留文件并忽略它们会更便宜。

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


这些文件占存档大小的35%。您指出的限制似乎仅在我重写文件时才适用,而不是在我就地修改它的情况下才适用(我有足够的空间来两次保存打包的存档)。有这样的工具吗?
2013年

那我可能误会了你的问题。如果您毕竟愿意解压缩tar,然后重新打包(只是没有实际创建tar文件,即直接将tar压缩到tar管道),则可能是可行的。
弗罗斯特斯

是的,我可以做到。只是文件具有我需要保留的uid / gids /属性。另外,我没有足够的磁盘空间来保存解压缩的表示形式。我有足够的空间来保存两个压缩的存档。
FUZxxl

1
完全没有问题。如果我可以一口气做到这一点,那么时间不会太长。我无法想象在实际释放存储时允许快速删除的任何存档格式。
FUZxxl

1
--wildcards帮助...虽然我必须./在模式开始时加入...
Gert van den Berg,

-4

根据手册,您可以传递文件名列表tar以仅提取这些文件名。例如:

$ tar --file archive.tar --list
foo
bar
baz

$ tar --file archive.tar --extract foo

我不知道--extract对我有什么帮助。您能详细说明一下吗?请记住,我无法将归档文件(或归档文件的大部分)解压缩到磁盘。
FUZxxl

2
请不要仅仅发布链接:这是一个Wiki,请添加足够的内容以使人们不必离开页面即可理解您的答案。
jasonwryan
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.