Это полностью зависит от того, какую файловую систему вы используете. Если вы используете ext4, то это потому, что они сделали его обратно совместимым с ext2. Если вам нужна лучшая система, не вините Linux, просто переключитесь на btrfs.
Я не думаю, что вы можете делать здесь то, что хотите. Проблема с вашим подходом заключается в том, что 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
Большинство из тех, кто работал с 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 /
Вы можете создать tar-файл как поток, если знаете окончательный размер того, что вы хотите передать (в байтах ). Затем необходимо создать начальный 512-байтовый заголовок перед потоком данных и завершающее заполнение после него. Хотя это зависит от точного варианта файла tar
, поскольку существует несколько разных форматов файлов. Следующие шаги могут помочь вам:
создать файл дыры того же размера, что и поток данных
$ dd if=/dev/zero of=mystream bs=1 count=0 seek=$SIZE
Обратите внимание, что mystream
теперь представляет собой «дырочный» файл, который на самом деле не занимает места на диске, хотя кажется, что он имеет тот же размер, $SIZE, что и поток данных.
используйте tar
для создания заголовка для файла с именем mystream
такого размера
$ tar cf - mystream | head -c 512 > header
Обратите внимание, что tar
захочет создать файл без дыр, поэтому важно отбросить все, кроме первых 512 байтов. Затем удалите файл отверстия, чтобы избежать его случайного копирования.
$ rm mystream
создайте трейлер для заполнения до 512 блоков.
$ head -c $((echo "scale=0; 512 - $SIZE % 512" | bc )) > trailer
создать tar-поток $STREAM (размера $SIZE )с заголовком и трейлером
$ cat header $STREAM trailer
Обратите внимание: вы, вероятно, захотите передать это во что-то другое, кроме стандартного вывода.
С помощью zsh
вы можете использовать форму замены процесса =(...)
, которая использует временный файл вместо конвейера. С опцией --transform
GNU 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
удаляет нулевые байты.