Как повторно сжать 2 миллиона gzip файлов, не храня их дважды?

Решение этой проблемы для разделителя и удаленных систем должно создать профиль разделителя, где команда, которую это выполняет 'как оболочка входа в систему', является строкой соединения SSH, используемой для доступа к удаленному серверу. Это предпочтено, чтобы иметь основанную на ключе аутентификацию SSH или openssh controlmaster/controlpath установка, чтобы иметь совместное использование соединения.

Отрывок разделителя конфигурируется для этого:

~/.config/terminator/config

[profiles]
[[default]]
 scroll_on_output = False
 exit_action = restart
 scrollback_infinite = True
[[remotehost]]
 use_custom_command = True
 exit_action = restart
 custom_command = ssh user@remotehost

И просто выполненный terminator -p remotehost использовать этот профиль. Каждый раз, когда Вы 'разделяете' терминалы, это использует этот профиль и таким образом открывает новое соединение SSH.

Для ssh controlmaster, см.: http://www.debian-administration.org/articles/290

8
06.11.2014, 15:55
3 ответа

Можно использовать avfs (при условии, что система GNU):

mkdir ~/AVFS &&
avfsd ~/AVFS &&
cd ~/AVFS/where/your/gz/files/are/ &&
find . -name '*.gz' -type f -printf '%p#\0' |
  tar --null -T - --transform='s/.gz#$//' -cf - | pigz > /dest/file.tar.gz
-121--49080-

Похоже, что ваш сервер IBM имеет таблицу разделов GPT и anaconda - установщик - не поддерживает GPT-диски в вашей версии.

Необходимо решить, требуется ли что-либо на диске. Если нет, нужно полностью протереть диск и начать заново.

Общий способ сделать это:

Загрузитесь с установочного носителя, перейдите в режим linux rescue . Вы должны получить подсказку оболочки. Оттуда

dd if=/dev/null of=dev/sda bs=1024 count=1

должен очистить загрузочную запись /dev/sda .

Примечание: Будет использоваться любой дистрибутив LiveCD.

И, конечно, имейте в виду, что это удалит все ! Все ваши разделы и данные на них будут потеряны, и диск будет выглядеть как новый, неиспользуемый диск для программы установки; поэтому убедитесь, что вы рады сделать это перед вводом команды выше.

При повторной попытке установки anaconda создаст таблицу разделов MSDOS , и все будет хорошо.

-121--146215-

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

dir_with_small_files=/home/john/files
tmpdir=/tmp/ul/dst
tarfile=/tmp/ul.tar
mkfifo "${tarfile}"

gzip <"${tarfile}" >"${tarfile}.gz" &

find "$dir_with_small_files" -type f | \
while read src; do
    dstdir="${tmpdir}/$(dirname $src)"
    dst="$(basename $src .gz)"
    mkdir -p "$dstdir"
    gunzip <"$src" >"${dstdir}/${dst}"
    # rm "$src" # uncomment to remove the original files
    echo "${dstdir}/${dst}"
done | \
cpio --create --format=ustar -v --quiet 2>&1 >"${tarfile}" | \
while read x; do
    rm "$x"
done

# clean-up
rm "$tarfile"
rm -r "$tmpdir"

Файлы временно разжимаются в $ tmpdir , передаются в cpio , затем, как только они добавляются в архив, удаляются.

3
27.01.2020, 20:11

Опция может быть использована AVFS (здесь, предполагая систему GNU):

mkdir ~/AVFS &&
avfsd ~/AVFS &&
cd ~/AVFS/where/your/gz/files/are/ &&
find . -name '*.gz' -type f -printf '%p#\0' |
  tar --null -T - --transform='s/.gz#$//' -cf - | pigz > /dest/file.tar.gz
6
27.01.2020, 20:11

Вот что я пробовал до сих пор - кажется, работает, но ужасно медленно, даже с Pypy:

#!/usr/bin/python

import tarfile
import os
import gzip
import sys
import cStringIO

tar = tarfile.open("/dev/stdout", "w|")
for name in sys.stdin:
    name = name[:-1]  # remove the trailing newline
    try:
        f = gzip.open(name)
        b = f.read()
        f.close()
    except IOError:
        f = open(name)
        b = f.read()
        f.close()
    # the [2:] there is to remove ./ from "find" output
    ti = tarfile.TarInfo(name[2:])
    ti.size = len(b)
    io = cStringIO.StringIO(b)
    tar.addfile(ti, io)
tar.close()

Использование: Найти. |. скрипт gzip> file.tar.gz

2
27.01.2020, 20:11

Теги

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