Извлечь строку из файла в архиве.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 ответ
Решение
Использовать каналы - почти во всех современных операционных системах канал существует полностью в памяти и не требует хранения полных промежуточных данных.
Ваша версия tar не имеет -J
опция для вызова bzip2/bunzip2 (которая будет автоматически использовать трубу за кулисами, как -z
есть), но есть -f -
читать архив со стандартного ввода. Так что вам нужно объединить:
- Скажите bunzip2 записать выходной файл в stdout:
bunzip2 -c <file>
- Скажите tar, чтобы он прочитал архив из stdin:
tar -x -f - ...
- Скажите tar записать извлеченный файл в stdout:
tar -O ...
- Скажите grep, чтобы прочитать ввод от stdin.
Результат:
bunzip2 -c /storage/archive.tar.bz2 | tar -x -O -f - dir1/dir2/file | grep version