У меня есть небольшая дилемма здесь ...
Мне нужно было перенести файлы объемом около 70 ГБ с одного из моих серверов на другой, поэтому я решил, что их сборка и отправка архива будет самым быстрым способом.
Однако на принимающем сервере остается только 5 ГБ свободного места после получения архива tar.
Есть ли какой-нибудь способ, которым я могу извлечь tar «на месте»? Мне не нужно хранить архив после того, как он был извлечен, поэтому мне было интересно, возможно ли это сделать.
Изменить: Следует отметить, что архив уже был отправлен, и я хотел бы избежать повторной отправки другим способом.
Если на другой машине есть ssh, я бы порекомендовал вам rsync в качестве другой альтернативы, которая не использует tar-файл:
И будьте осторожны с ведущими
/
Изменить обновление
Что ж, теперь я вижу, как это здорово, если вы не можете удалить его и возобновить с помощью rsync. Я, вероятно, попробую выборочное извлечение и удаление из tar.
селективный экстракт:
выборочное удаление:
Тем не менее, кажется, что вы потратите много времени на написание сценария для этого ...
источник
По сути, вам нужна возможность направить файл в tar и «перебить» фронт по мере продвижения.
На StackOverflow кто-то спрашивал, как обрезать файл спереди , но кажется, что это невозможно. Вы все еще можете заполнить начало файла нулями особым образом, чтобы файл стал разреженным файлом , но я не знаю, как это сделать. Мы можем обрезать конец файла, хотя. Но tar должен читать архив вперед, а не назад.
Решение 1
Уровень косвенности решает все проблемы. Сначала переверните файл на месте, затем прочитайте его назад (что приведет к чтению исходного файла вперед) и обрежьте конец перевернутого файла по мере продвижения.
Вам нужно написать программу (c, python, что угодно), чтобы обмениваться началом и концом файла, порциями и порциями, а затем передавать эти куски в tar при одновременном усечении файла порциями. Это основа для решения 2, которое, возможно, проще реализовать.
Решение 2
Другой способ - разделить файл на небольшие куски , а затем удалить их по мере их извлечения. Приведенный ниже код имеет размер фрагмента в один мегабайт, который можно настроить в зависимости от ваших потребностей. Чем больше, тем быстрее, но займет больше промежуточного пространства при разделении и во время извлечения.
Разделите файл archive.tar:
Передайте эти файлы в tar (обратите внимание, нам нужна переменная chunkprefix во втором терминале):
Поскольку мы используем именованный канал (
mkfifo fifo
), вам не нужно передавать все куски сразу. Это может быть полезно, если вы действительно ограничены в пространстве. Вы можете выполнить следующие шаги:while [ -e … ]; do cat "$chunk…; done
цикл завершен (второй терминал):tar
команду, НЕ удаляйте fifo (первый терминал), но вы можете запуститьsync
, на всякий случай,while [ -e … ]; do cat "$chunk…; done
снова запустив строки.Конечно, это все как волатильность , вам нужно сначала проверить, все ли нормально в фиктивном архиве, потому что, если вы допустили ошибку, попрощайтесь с данными .
Вы никогда не узнаете,
tar
действительно ли первый терминал ( ) действительно завершил обработку содержимого fifo, поэтому, если вы предпочитаете, вы можете запустить его вместо этого, но у вас не будет возможности беспрепятственно обмениваться фрагментами с другим диском:отказ
Обратите внимание, что для того, чтобы все это работало, ваша оболочка, хвост и усечение должны правильно обрабатывать 64-разрядные целые числа (для этого вам не нужен ни 64-разрядный компьютер, ни операционная система). Мой делает, но если вы запустите вышеупомянутый скрипт в системе без этих требований, вы потеряете все данные в archive.tar .
И в любом случае, если что-то не так, вы все равно потеряете все данные в archive.tar, поэтому убедитесь, что у вас есть резервная копия ваших данных.
источник
Если у вас есть объектные файлы для перемещения, попробуйте удалить их. Это сэкономит значительное количество места.
источник