Как уменьшить изображение файла, созданного с помощью dd?

Использованиеawk:

awk '{ group[$2] = (group[$2] == "" ? $1 : group[$2] OFS $1 ) }
     END { for (group_name in group) print group_name, group[group_name] }' inputfile

Это сохраняет группы в массиве с именем group. Этот массив индексируется по имени группы (, второму столбцу входных данных ), и для каждой строки ввода из inputfileзначение в первом столбце добавляется к правильной группе.

Блок ENDперебирает все собранные группы и выводит имя группы и записи этой группы.

Эта awkпрограмма с более удобным расположением элементов:

{
    group[$2] = (group[$2] == "" ? $1 : group[$2] OFS $1 )
}

END {
    for (group_name in group)
        print group_name, group[group_name]
}

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

Для больших объемов данных мы предполагаем, что ввод отсортирован по именам групп (второй столбец )и используем

awk '$2 != group_name { if (group != "") print group_name, group; group = ""; group_name = $2 }
    { group = (group == "" ? $1 : group OFS $1) }
    END { if (group != "") print group_name, group }' inputfile

Это отслеживает, что представляет собой текущая группа, и собирает данные для этой группы. Всякий раз, когда второй столбец во входных данных переключается на другое значение, он выводит собранные групповые данные и начинает собирать новые данные. Это означает, что всегда сохраняется только несколько строк ввода, а не весь набор входных данных.

Эта последняя awkпрограмма с более красивым макетом:

$2 != group_name {
    if (group != "")
        print group_name, group

    group = ""
    group_name = $2
}

{
    group = (group == "" ? $1 : group OFS $1)
}

END {
    # Output last group (only), if there was any data at all.
    if (group != "")
        print group_name, group
}
1
09.07.2020, 22:03
1 ответ

Спасибо @sudodus и @fra -сан.

Я думаю, что существует проблема совместимости при объединении resize2fsи partedдля сжатия файла fs/partition. resize2fs использует блоки по 4 КБ, при разделении используются байты или МБ, ГБ и т. д.

В конце концов я нашел другой способ уменьшить размер второго раздела:gnome-disks. Он поставляется с Linux Mint и работает очень хорошо. Там, где parted и gparted не удалось сжать второй раздел, дискам gnome -удалось изменить размер как fs, так и раздела за одну операцию.

После сжатия fs/partition в loop0p2 осталось пустое место. Я хочу уменьшить файл изображения. Итак, я сделал:

root@O3:/home/m# fdisk -l /dev/loop0
Disk /dev/loop0: 7,5 GiB, 8068792320 bytes, 15759360 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x8889db7f

Device       Boot  Start     End Sectors  Size Id Type
/dev/loop0p1        8192  532479  524288  256M  c W95 FAT32 (LBA)
/dev/loop0p2      532480 8355839 7823360  3,7G 83 Linux

обрезать размер? (8192 + 524288 + 7823360)*512 = 4278190080 Б

truncate --size=4278190080 image-file.img

После повторного сопоставления результирующего файла образа с loop0 ошибок fs/partition больше нет.

3
18.03.2021, 23:23

Теги

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