2015-03-11 3 views
0

Я нахожусь в системе Linux с ограниченными ресурсами и BusyBox - эта версия tar не поддерживает --append, -r. Есть ли обходной путь, который позволит мне [1] добавлять файлы из каталога B в существующий файл tar из каталога A после [2], чтобы B-файлы появились из каталога A? (Позже, когда кто-то извлекает файлы, все они должны быть в том же каталоге A.)BusyBox tar: добавьте обходное ограничение на ограниченное дисковое пространство?

Ситуация: У меня есть список файлов, которые я хочу использовать tar, но сначала я должен обработать некоторые из этих файлов. Файлы могут использоваться другими процессами, поэтому я не хочу редактировать их на месте. Я хочу быть консервативным при использовании дискового пространства, поэтому мой скрипт копирует только те файлы, которые ему нужно изменить (vs копирует их все, а затем обрабатывает некоторые и, наконец, архивирует их все с помощью tar - если бы я скопировал их все, что я мог бы запустить на дисковое пространство вопросы).

Это означает, что файлы, которые я хочу архивировать, заканчиваются в двух разных местах. Но я хочу, чтобы полученный tar-файл появлялся так, как будто все они находились в одном месте. В конце моего сценария я заканчиваю двумя текстовыми файлами, перечисляющими файлы A и B по имени.

Я думаю, что это просто с полномасштабной версией tar, но мне нужно работать с версией BusyBox (использование ниже). Заранее спасибо за любые идеи!

Usage: tar -[cxtzjaZmvO] [-X FILE] [-f TARFILE] [-C DIR] [FILE]... 

Create, extract, or list files from a tar file 

Operation: 
    c Create 
    x Extract 
    t List 
Options: 
    f Name of TARFILE ('-' for stdin/out) 
    C Change to DIR before operation 
    v Verbose 
    z (De)compress using gzip 
    j (De)compress using bzip2 
    a (De)compress using lzma 
    Z (De)compress using compress 
    O Extract to stdout 
    h Follow symlinks 
    m Don't restore mtime 
    exclude File to exclude 
    X File with names to exclude 
    T File with names to include 

ответ

1

В принципе, вам просто нужно добавить в tar репозиторий, содержащий дополнительные файлы в конец файла tar. Это только немного сложнее.

Файл tar состоит из любого количества повторений header + file. Заголовок всегда представляет собой один 512-байтовый блок, а файл дополняется до 512 байт, поэтому вы можете думать об этих единицах как о переменном количестве 512-байтовых блоков. Каждый блок независим; заголовок начинается с полного пути к файлу. Таким образом, нет необходимости, чтобы файлы в каталоге были смоделированы вместе.

Существует одно осложнение. В конце tar-файла есть как минимум два 512-байтных блока, полностью заполненных 0s. Когда tar читает tar-файл, он игнорирует один заполненный нулем заголовок, но второй вызывает его остановку чтения файла. Если он попадает в EOF, он будет жаловаться, поэтому требуются завершающие пустые заголовки.

Может быть более двух заголовков, потому что tar фактически записывает в блоках, которые кратно 512 байтам. Например, Gnu tar, по умолчанию, записывает краткими из 20 512-байтовых фрагментов, поэтому самый маленький tar-файл обычно составляет 10240 байт.

Чтобы добавить новые данные, вам необходимо сначала обрезать существующий файл, чтобы устранить пустые блоки.

Я считаю, что если tar-файл был создан busybox, будет только два пустых блока, но я не проверял код. Это было бы легко; вам нужно всего лишь обрезать последние 1024 байта файла перед добавлением дополнительных файлов.

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

Что бы я сделал это:

  1. Обрезать последние 1024 байт файла дегтя.
  2. Помните текущий размер файла tar.
  3. Добавляет файл тест дегтя, состоящий из смолы файла с помощью простого короткого сообщения
  4. Убедитесь, что tar tf правильно показывает тестовый файл
  5. Обрезать файл обратно в запоминаемой длину,
    • Если tar tf нашел имя тестового файла, успех
    • Если последние 512 байт файла дегтя всех 0s, усечение 512 байт файла и вернуться к шагу 2.
    • в противном случае не в состоянии

Если описанная выше процедура завершена успешно, вы можете перейти к добавлению репозитория tar к новым файлам.

Я не знаю, есть ли команда trunc. Если нет, вы можете использовать dd скопировать файл поверх старого файла с заданным смещением (см. Параметр seek=). dd автоматически усекает файл в конце копии. Вы также можете использовать dd для чтения 512-байтового блока (см. Параметры skip и count).

+0

Будет ли эта процедура работать для всех действительных tar-файлов независимо от их содержимого? – user1011471

+0

@ user1011471: Я не понимаю, почему нет. – rici

+0

Причина, по которой я прошу, состоит в том, что некоторые файлы сами являются .gz-файлами. Вы написали: «Если бы вы знали, что в самих файлах нет NUL-байтов (т. Е. Все они были простыми текстовыми файлами), вы можете удалить пустые заголовки, пока не найдете в нем блок с не-0 байтом» ... и ... «Если последние 512 байт файла tar - все 0s» ... – user1011471