从 .tar.bz2 存档文件中提取行

从 .tar.bz2 存档文件中提取行

我想使用一行上的 stdin/stdout 显示 .tar.bz2 档案中文件的版本,而不会影响现有档案或留下任何临时文件。该文件只有一行包含版本。

这些命令有效,但它们会留下临时文件:

cp /storage/archive.tar.bz2 /tmp/
bunzip2 /tmp/archive.tar.bz2
tar -C /tmp -xvf /tmp/archive.tar dir1/dir2/file
cat /tmp/dir1/dir2/file | grep version

我使用的 busybox 版本具有受限的命令集:

# bunzip2 --help
BusyBox v1.23.2 (2017-08-22 01:34:50 UTC) multi-call binary.

Usage: bunzip2 [-cf] [FILE]...

Decompress FILEs (or stdin)

        -c      Write to stdout
        -f      Force

# tar -h
BusyBox v1.23.2 (2017-08-22 01:34:50 UTC) multi-call binary.

Usage: tar -[cxtzhvO] [-X FILE] [-T FILE] [-f TARFILE] [-C DIR] [FILE]...

Create, extract, or list files from a tar file

Operation:
        c       Create
        x       Extract
        t       List
        f       Name of TARFILE ('-' for stdin/out)
        C       Change to DIR before operation
        v       Verbose
        z       (De)compress using gzip
        O       Extract to stdout
        h       Follow symlinks
        X       File with names to exclude
        T       File with names to include

答案1

使用管道——在几乎所有最新的操作系统中,管道完全存在于内存中,不需要存储完整的中间数据。

你的版本柏油没有-J调用 bzip2/bunzip2 的选项(它会在后台自动使用管道,就像-zdoes 一样),但它必须-f -从 stdin 读取存档。因此您需要结合:

  1. 告诉bunzip2将输出文件写入标准输出:bunzip2 -c <file>
  2. 告诉柏油从标准输入读取档案:tar -x -f - ...
  3. 告诉柏油将提取的文件写入标准输出:tar -O ...
  4. 告诉grep从标准输入读取输入。

结果是:

bunzip2 -c /storage/archive.tar.bz2 | tar -x -O -f - dir1/dir2/file | grep version

相关内容