Как сократить файл из командной строки?

Как сократить файл из командной строки?

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

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

решение1

Предположим, вы хотите обрезать и извлечь первый 1 ГБ из файла размером 150 ГБ:

С head:

head -c 1G infile > outfile

Обратите внимание, что Gсуффикс можно заменить на , GBчтобы выровнять по 1000 вместо 1024.

Или с dd:

dd if=infile of=outfile bs=1M count=1024

Или, как в ответе Вампуса Кью. Уомбли, ddможно обрезать на месте.

решение2

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

truncate -s 1G file.xml

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

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

решение3

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

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

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

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

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

решение4

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

split -C 1G <filename>

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

Связанный контент