У меня есть xml-файл объемом 150 ГБ, который я хотел бы сократить (т.е. усечь) до 1 ГБ - есть ли простая (bash или аналогичная) команда, которую я могу использовать, или мне нужно идти программным путем (редактируя его в vi или emacs) кошмар даже на больших железных системах)?
(Я не особенно обеспокоен потерей информации, мне нужен более короткий файл, чтобы я мог протестировать часть программного обеспечения на этом и не ждать много часов ответа, более короткий файл позволит мне это сделать.)
bash
unix
file-management
adrianmcmenamin
источник
источник
Ответы:
Предполагая, что вы хотите обрезать и извлечь первые 1 ГБ файла размером 150 ГБ:
С
head
:head -c 1G infile > outfile
Обратите внимание, что
G
суффикс можно заменить,GB
чтобы выровнять по 1000 вместо 1024.Или с
dd
:dd if=infile of=outfile bs=1M count=1024
Или, как в ответе Wumpus Q. Wumbley,
dd
может усечь на месте.источник
Чтобы обрезать файл до 1 гигабайта, используйте
truncate
команду:Результат усечения, скорее всего, не будет правильным XML-файлом, но я понимаю, что вы это понимаете.
Документация для версии ГНУ
truncate
является здесь и документация для версии BSD является здесьисточник
Где возможно, я бы использовал
truncate
команду, как в ответе Джона 1024. Однако это не стандартная команда unix, так что вы можете однажды оказаться не в состоянии ее использовать. В этом случае такжеdd
можно выполнить усечение на месте.dd
Поведение по умолчанию - обрезать выходной файл в точке, где копирование заканчивается, так что вы просто даете ему входной файл 0 длины и говорите ему начинать запись в нужной точке усечения:(Это не то же самое, что копирование и усечение
dd
в ответе multithr3at3d.)Обратите внимание, что я использовал 1048576 и 1024, потому что 1048576 * 1024 - желаемый размер. Я избегал бс = 1м , потому что это «портативность» ответ, и классический
dd
знает только суффиксыk
,b
иw
.источник
bs
число, умноженное наseek
число, - это количество байтов, которое нужно сохранить. Любые два числа, которые удовлетворяют этому ограничению, должны работать; например,bs=1073741824 seek=1
илиbs=1 seek=1073741824
. Или, так как поbs
умолчанию 512,seek=2097152
один также должен работать. И вы можете использовать обозначение , как1M
,1K
,1G
и2M
.Я не совсем уверен, что вы спрашиваете. Вы просто хотите избавиться от остальных 149 ГБ или пытаетесь сжать 150 ГБ в 1 ГБ? Несмотря на это, это может быть полезным методом для достижения этой цели.
Команда
split
может разбить любой файл на несколько частей. Видеть человека разделились . Вы можете указать размер фрагментов файла, на которые хотите разбить его, с помощью-b
опции. Например:$ split -b 1 ГБ myfile.xml
Без каких-либо других параметров это должно создать несколько файлов в текущем каталоге, начиная с буквы
x
. Если вы хотите настроить имена разделенных файлов, обратитесь к справочной странице.Для повторной сборки файла просто используйте
cat * > re-assembled.xml
.Пример:
источник
Вы можете использовать
split
команду.Для более подробной информации взгляните на этот ответ stackoverflow
источник
В конце я просто использовал
sed
для извлечения произвольное количество строк:источник
sed 1000000q
(и немного компактнее, визуально говоря).