Это невозможно сделать точно на месте.
Может быть, что-то, что вы можете использовать, - это решение, предложенное в этом ответе:вместо извлечения архива tar
archive="archive.tar"
chunkprefix="chunk_"
# 1-Mb chunks :
chunksize=1048576
totalsize=$(wc -c "$archive" | cut -d ' ' -f 1)
currentchunk=$(((totalsize-1)/chunksize))
while [ $currentchunk -ge 0 ]; do
# Print current chunk number, so we know it is still running.
echo -n "$currentchunk "
offset=$((currentchunk*chunksize))
# Copy end of $archive to new file
tail -c +$((offset+1)) "$archive" > "$chunkprefix$currentchunk"
# Chop end of $archive
truncate -s $offset "$archive"
currentchunk=$((currentchunk-1))
done
Он копирует часть файла в другой файл и немедленно удаляет его из оригинала.
Таким образом, вам нужно только 1 МБ свободного дискового пространства (при условии, что вы разделены на 1 МБ).
РЕДАКТИРОВАТЬ: Если у вас нулевое свободное дисковое пространство, но достаточно оперативной памяти, вы можете создать виртуальный диск и хранить там каждый чанк, пока удаляете исходный чанк. Не проверял это хотя:
ramsize=4096
rammount=/ramdisk
archive="archive.tar"
chunkprefix="$rammount/chunk_"
# 1-Mb chunks :
chunksize=1048576
mkdir $rammount
mkfs -q /dev/ram1 $ramsize
mount /dev/ram1 $rammount
totalsize=$(wc -c "$archive" | cut -d ' ' -f 1)
currentchunk=$(((totalsize-1)/chunksize))
while [ $currentchunk -ge 0 ]; do
# Print current chunk number, so we know it is still running.
echo -n "$currentchunk "
offset=$((currentchunk*chunksize))
# Copy end of $archive to new file
tail -c +$((offset+1)) "$archive" > "$chunkprefix$currentchunk"
# Chop end of $archive
truncate -s $offset "$archive"
# copy the chunk on disk
cp "$chunkprefix$currentchunk" .
currentchunk=$((currentchunk-1))
done
Это точно такой же сценарий, за исключением того, что он начинается с создания и монтирования виртуального диска емкостью 4 МБ и временно сохраняет там каждый чанк до тех пор, пока он не освободит место путем усечения исходного файла.