Я хотел бы использовать 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 ответ1

1

Использовать каналы - почти во всех современных операционных системах канал существует полностью в памяти и не требует хранения полных промежуточных данных.

В вашей версии tar нет опции -J для вызова bzip2/bunzip2 (которая будет автоматически использовать канал за кулисами, как в -z ), но она имеет -f - для чтения архива из stdin. Так что вам нужно объединить:

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

Результат:

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .