如何从tar.gz归档中删除单个文件?

25

我有一个庞大的tarbell存档文件,其中包含一个过于庞大或损坏的error_log文件,在尝试提取它时会导致存档挂起。在Mac OS X终端中,有没有一种方法可以在解压缩之前从存档中删除这个文件,或者在提取存档时不提取该特定文件?

我在这篇文章上找到了如何有效地从大型tgz文件中删除文件的方法,但是我尝试了--delete标志,但收到了此错误:

tar: Option --delete is not supported

有没有办法:

  1. 在不解压文件的情况下从存档中删除文件?
  2. 提取存档但排除该文件?

你使用的是哪个版本的 tar?如果过时了,请尝试更新到最新版本,并检查 man 页面,看看 tar 是否支持 --delete 选项。 - Santosh A
1
“--delete”选项是特定于某些“tar”程序的(尤其是在Linux下默认可用的程序)。从记忆中,macOS下的默认tar不支持该选项。您需要阅读man/help文件或获取支持此功能的程序。如果所有其他方法都失败了,请解压缩“.tar.gz”文件,从存档中提取所有内容,删除不需要的文件,然后重新构建存档。 - Peter
Santosh和Peter,非常感谢你们的回复。Santosh,不确定Mac OS X上运行的tar版本,也不知道如何更新它。Peter,也谢谢你。这不是一个选项,因为由于error_log太大,解压缩归档文件失败。 - KillerDesigner
5个回答

29

如评论中所述,使用tar无法删除文件,但您可以在提取时排除该文件:

tar -zxvf file.tar.gz --exclude "file_to_exclude"

非常顺利地完成了工作。谢谢。 - KillerDesigner

19

你可以这样重新打包:

tar -czvf ./new.tar.gz --exclude='._*' @old.tar.gz

我使用._*来删除所有的._files,但你可以使用任何你喜欢的模式,包括完整路径、目录、文件名或其他。


这是唯一一个真正解决我的问题的答案,即在第一次打包时不添加额外文件。谢谢! - Henry Williams
8
需要使用bsdtar,因为GNU tar不支持'@'语法。 - Jakob

8

我分三步完成了这个操作。希望将来能帮助其他人。

gzip -d file.tar.gz
tar -f file.tar --delete folder1/file1.txt --delete folder2/file2.txt
gzip -9 file.tar

如果您有多个文件,请使用此选项。但是这些归档文件必须包含您想要删除的所有文件,否则tar将会报错。

for f in *.tar.gz
do
        echo "Processing file $f"
        gzip -d "$f"
        tar -f "${f%.*}" --delete folder1/file1.txt --delete folder2/file2.txt
        gzip -9 "${f%.*}"
done

1
我想用一行命令从elasticsearch-oss存档中删除jdk目录,这是我想出来的方法:
gzip -d elasticsearch-oss-7.10.1-linux-x86_64.tar.gz -c | tar --delete --wildcards */jdk | gzip - > /tmp/tmp.$$.tar.gz && mv /tmp/tmp.$$.tar.gz elasticsearch-oss-7.10.1-linux-x86_64.tar.gz

我进一步完善了这个,包括下载功能:
curl -Ss https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-oss-7.10.1-linux-x86_64.tar.gz | gzip -d - -c | tar --delete --wildcards */jdk | gzip - > elasticsearch-oss-7.10.1-linux-x86_64.tar.gz

在Ubuntu 20.04上运行良好,因为GNU tar不支持@符号。


-8

亲爱的,你可以通过与我们从下面的命令中删除目录相同的格式来删除归档文件

命令:- rm -rf 归档文件名 r:- 递归地删除


我很钦佩你保留这个帖子,尽管很明显你没有理解问题,所以你的回复真的非常奇怪。顺便说一句,我没有给它点踩,因为已经有足够多的踩了。 - Peter VARGA

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接