Сделайте TAR из / dev / stdin file

Это полностью зависит от того, какую файловую систему вы используете. Если вы используете ext4, то это потому, что они сделали его обратно совместимым с ext2. Если вам нужна лучшая система, не вините Linux, просто переключитесь на btrfs.

5
05.08.2018, 06:50
3 ответа

Я не думаю, что вы можете делать здесь то, что хотите. Проблема с вашим подходом заключается в том, что tarимеет дело с файлами и деревьями каталогов, которые вы не предоставляете с помощью таких команд, как эта:

$ echo test | tar -cf test.tar /dev/sdtin

Даже когда вы пытаетесь «обернуть» свои строки во временные файлы с помощью подоболочек, таких как этот:

$ tar -cf test.tar <(echo test)

Вы можете видеть, что ваш контент все еще обрабатывается TAR, используя эти временные файловые дескрипторы:

$ tar tvf test.tar
lr-x------ vagrant/vagrant   0 2018-08-04 23:52 dev/fd/63 -> pipe:[102734]

Если вы хотите просто сжать строки, вам нужно поместить их в контекст файла. Так что вам нужно сделать что-то вроде этого:

$ echo "test" > somefile && tar -cf /tmp/test.tar somefile

Вы можете видеть, что файл присутствует внутри файла TAR:

$ tar tvf /tmp/test.tar
-rw-rw-r-- vagrant/vagrant   5 2018-08-05 00:00 somefile

Репликация данных с помощью tar

Большинство из тех, кто работал с Unix в течение нескольких лет, скорее всего, сталкивались с этим паттерном:

$ (cd /; tar cf -.)|(cd /mnt/newroot; tar pxvf -)

Раньше я постоянно использовал это для репликации данных из одного места в другое. Вы также можете использовать это через SSH. Другие методы обсуждаются в этом разделе вопросов и ответов U&L под названием:клонирование дерева корневых каталогов с использованием busybox .

Резервное копирование /

Также существует этот метод, если вы хотите сделать резервную копию всего жесткого диска:

$ sudo tar -cvpzf backup.tar.gz --exclude=/backup.tar.gz --one-file-system /

Ссылки

5
27.01.2020, 20:35

Вы можете создать tar-файл как поток, если знаете окончательный размер того, что вы хотите передать (в байтах ). Затем необходимо создать начальный 512-байтовый заголовок перед потоком данных и завершающее заполнение после него. Хотя это зависит от точного варианта файла tar, поскольку существует несколько разных форматов файлов. Следующие шаги могут помочь вам:

  1. создать файл дыры того же размера, что и поток данных

    $ dd if=/dev/zero of=mystream bs=1 count=0 seek=$SIZE

    Обратите внимание, что mystreamтеперь представляет собой «дырочный» файл, который на самом деле не занимает места на диске, хотя кажется, что он имеет тот же размер, $SIZE, что и поток данных.

  2. используйте tarдля создания заголовка для файла с именем mystreamтакого размера

    $ tar cf - mystream | head -c 512 > header

    Обратите внимание, что tarзахочет создать файл без дыр, поэтому важно отбросить все, кроме первых 512 байтов. Затем удалите файл отверстия, чтобы избежать его случайного копирования.

    $ rm mystream

  3. создайте трейлер для заполнения до 512 блоков.

    $ head -c $((echo "scale=0; 512 - $SIZE % 512" | bc )) > trailer

  4. создать tar-поток $STREAM (размера $SIZE )с заголовком и трейлером

    $ cat header $STREAM trailer

    Обратите внимание: вы, вероятно, захотите передать это во что-то другое, кроме стандартного вывода.

2
27.01.2020, 20:35

С помощью zshвы можете использовать форму замены процесса =(...), которая использует временный файл вместо конвейера. С опцией --transformGNU tarвы можете изменить имя члена архива:

tar --transform='s/.*/test-file/' -zcf file.tar.gz =(echo test)

Будет создан file.tar.gzс одним test-fileучастником с разрешениями 0600 и содержимым test\n.

С помощьюbash(илиzsh)вы можете сделать:

tar --transform='s/.*/test-file/' -zchf file.tar.gz /dev/stdin <<< "$(echo test)"

Здесь -строки также используют временные файлы в этих оболочках. Обратите внимание, однако, что подстановка команды удаляет каждый завершающий символ новой строки и добавляет один назад, а в bashудаляет нулевые байты.

2
27.01.2020, 20:35

Теги

Похожие вопросы