9

У меня есть xml-файл объемом 150 ГБ, который я хотел бы сократить (т.е. усечь) до 1 ГБ - есть ли простая (bash или аналогичная) команда, которую я могу использовать, или мне нужно идти программным путем (редактируя его в vi или emacs) это кошмар даже на больших железных системах)?

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

6 ответов6

37

Чтобы обрезать файл до 1 гигабайта, используйте команду truncate :

truncate -s 1G file.xml

Результат усечения, вероятно, не будет правильным XML-файлом, но я понимаю, что вы это понимаете.

Документация для GNU-версии truncate находится здесь, а документация для BSD-версии здесь.

15

Предполагая, что вы хотите обрезать и извлечь первые 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 может усечь на месте.

14

Где это возможно, я бы использовал команду truncate как в ответе Джона 1024. Однако это не стандартная команда unix, так что вы можете однажды оказаться не в состоянии ее использовать. В этом случае dd может выполнять усечение на месте.

Поведение dd умолчанию - обрезать выходной файл в точке, где заканчивается копирование, поэтому вы просто даете ему входной файл нулевой длины и говорите ему начинать запись в нужной точке усечения:

dd if=/dev/null of=filename bs=1048576 seek=1024

(Это не то же самое, что копирование и усечение dd в ответе multithr3at3d.)

Обратите внимание, что я использовал 1048576 и 1024, потому что 1048576 * 1024 - желаемый размер. Я избегал bs = 1m, потому что это ответ "переносимости", а классический dd знает только суффиксы k , b и w .

1

Я не совсем уверен, что вы спрашиваете. Вы просто хотите избавиться от остальных 149 ГБ или пытаетесь сжать 150 ГБ в 1 ГБ? Несмотря на это, это может быть полезным методом для достижения этой цели.

Команда split может разбить любой файл на несколько частей. Видеть человека разделились. Вы можете указать размер фрагментов файла, на которые вы хотите разбить его, с помощью опции -b . Например:

$ split -b 1 ГБ myfile.xml

Без каких-либо других параметров это должно создать несколько файлов в текущем каталоге, начиная с буквы x . Если вы хотите настроить имена разделенных файлов, обратитесь к справочной странице.

Для повторной сборки файла просто используйте cat * > re-assembled.xml .

Пример:

[kent_x86.py@c7 split-test]$ ls -l opendocman*
-rw-rw-r--.  1 kent_x86.py kent_x86.py 2082602 Mar 31  2017 opendocman-1.3.5.tar.gz

[kent_x86.py@c7 split-test]$ split -b 100K opendocman-1.3.5.tar.gz 
[kent_x86.py@c7 split-test]$ ls
opendocman-1.3.5.tar.gz  xaa  xab  xac  xad  xae  xaf  xag  xah  xai  xaj  xak  xal  xam  xan  xao  xap  xaq  xar  xas  xat  xau
[kent_x86.py@c7 split-test]$ ll
total 4072
-rw-rw-r--. 1 kent_x86.py kent_x86.py 2082602 Jan  5 11:06 opendocman-1.3.5.tar.gz
-rw-rw-r--. 1 kent_x86.py kent_x86.py  102400 Jan  5 11:06 xaa
-rw-rw-r--. 1 kent_x86.py kent_x86.py  102400 Jan  5 11:06 xab
-rw-rw-r--. 1 kent_x86.py kent_x86.py  102400 Jan  5 11:06 xac
-rw-rw-r--. 1 kent_x86.py kent_x86.py  102400 Jan  5 11:06 xad
-rw-rw-r--. 1 kent_x86.py kent_x86.py  102400 Jan  5 11:06 xae
-rw-rw-r--. 1 kent_x86.py kent_x86.py  102400 Jan  5 11:06 xaf
-rw-rw-r--. 1 kent_x86.py kent_x86.py  102400 Jan  5 11:06 xag
-rw-rw-r--. 1 kent_x86.py kent_x86.py  102400 Jan  5 11:06 xah
-rw-rw-r--. 1 kent_x86.py kent_x86.py  102400 Jan  5 11:06 xai
-rw-rw-r--. 1 kent_x86.py kent_x86.py  102400 Jan  5 11:06 xaj
-rw-rw-r--. 1 kent_x86.py kent_x86.py  102400 Jan  5 11:06 xak
-rw-rw-r--. 1 kent_x86.py kent_x86.py  102400 Jan  5 11:06 xal
-rw-rw-r--. 1 kent_x86.py kent_x86.py  102400 Jan  5 11:06 xam
-rw-rw-r--. 1 kent_x86.py kent_x86.py  102400 Jan  5 11:06 xan
-rw-rw-r--. 1 kent_x86.py kent_x86.py  102400 Jan  5 11:06 xao
-rw-rw-r--. 1 kent_x86.py kent_x86.py  102400 Jan  5 11:06 xap
-rw-rw-r--. 1 kent_x86.py kent_x86.py  102400 Jan  5 11:06 xaq
-rw-rw-r--. 1 kent_x86.py kent_x86.py  102400 Jan  5 11:06 xar
-rw-rw-r--. 1 kent_x86.py kent_x86.py  102400 Jan  5 11:06 xas
-rw-rw-r--. 1 kent_x86.py kent_x86.py  102400 Jan  5 11:06 xat
-rw-rw-r--. 1 kent_x86.py kent_x86.py   34602 Jan  5 11:06 xau
[kent_x86.py@c7 split-test]$ cat xa* > opendoc-reassembled.tar.gz
[kent_x86.py@c7 split-test]$ ls -l opendoc-reassembled*
-rw-rw-r--. 1 kent_x86.py kent_x86.py 2082602 Jan  5 11:07 opendoc-reassembled.tar.gz
0

Вы можете использовать команду split .

split -C 1G <filename>

Для более подробной информации взгляните на этот ответ stackoverflow

0

В конце я просто использовал sed для извлечения произвольного числа строк:

sed -n 1,1000000p infile.xml>outfile.xml

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .