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

Kil*_*ner 14 gzip tar

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

我发现这篇文章关于如何有效地从大文件中删除文件但是,我尝试了--delete标志,但是收到了这个错误:

tar: Option --delete is not supported
Run Code Online (Sandbox Code Playgroud)

有办法:

  1. 从档案中删除文件而不解压缩?
  2. 提取存档但排除文件?

msf*_*ter 16

如评论中所述,使用tar删除文件是不可能的,但您可以在解压缩时排除文件:

tar -zxvf file.tar.gz --exclude "file_to_exclude"
Run Code Online (Sandbox Code Playgroud)


voi*_*ces 10

您可以像这样重新打包它:

tar -czvf ./new.tar.gz --exclude='._*' @old.tar.gz
Run Code Online (Sandbox Code Playgroud)

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

  • 需要 [bsdtar](https://manpages.debian.org/buster/libarchive-tools/bsdtar.1.en.html),但 GNU tar 不支持“@”语法。 (3认同)

Nin*_*nel 8

我用树步骤做到了这一点。希望将来能帮助其他人。

gzip -d file.tar.gz
tar -f file.tar --delete folder1/file1.txt --delete folder2/file2.txt
gzip -9 file.tar
Run Code Online (Sandbox Code Playgroud)

如果您有多个文件,请使用此选项。但存档中必须包含要删除的所有文件,否则 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
Run Code Online (Sandbox Code Playgroud)