我想使用一行上的 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 的选项(它会在后台自动使用管道,就像-z
does 一样),但它必须-f -
从 stdin 读取存档。因此您需要结合:
- 告诉bunzip2将输出文件写入标准输出:
bunzip2 -c <file>
- 告诉柏油从标准输入读取档案:
tar -x -f - ...
- 告诉柏油将提取的文件写入标准输出:
tar -O ...
- 告诉grep从标准输入读取输入。
结果是:
bunzip2 -c /storage/archive.tar.bz2 | tar -x -O -f - dir1/dir2/file | grep version