Извлечь строку из файла в архиве.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 - читать архив со стандартного ввода. Так что вам нужно объединить:

  1. Скажите bunzip2 записать выходной файл в stdout: bunzip2 -c <file>
  2. Скажите tar, чтобы он прочитал архив из stdin: tar -x -f - ...
  3. Скажите tar записать извлеченный файл в stdout: tar -O ...
  4. Скажите grep, чтобы прочитать ввод от stdin.

Результат:

bunzip2 -c /storage/archive.tar.bz2 | tar -x -O -f - dir1/dir2/file | grep version
Другие вопросы по тегам