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

How do I delete a single file from a tar.gz archive

我有一个巨大的 tarbell 存档,其中有一个过大或损坏的 error_log,导致存档在尝试提取它时挂起。有没有办法在解压缩或提取档案之前从档案中删除它而不在 Mac OS X 终端上提取特定文件?

我发现这个 post 关于如何 efficiently-remove-files-from-large-tgz 但是,我尝试了 --delete 标志,但收到此错误:

tar: Option --delete is not supported

有没有办法:

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

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

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

亲爱的,您可以通过与我们通过

从以下命令中删除目录相同的格式删除存档文件

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

你可以这样重新打包:

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

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

我是按树步骤做的。希望以后能帮助到别人。

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

我想用一个衬垫从 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 不支持 @ 符号。