Как я могу отредактировать большой файл на месте?


18

У меня есть несколько файлов размером> 1 ГБ каждый. Мне нужно удалить последние несколько байтов из файлов. Как мне это сделать? Я предпочитаю редактировать файл на месте, чтобы сэкономить место на диске.

Я нахожусь на HP-UX.


Я думаю, что vimимеет предел 4G (может быть неправильно), но я не думаю, что он делает это на месте (может быть неправильно).
ксенотеррацид

1
@xenoterracide: у меня нет vim здесь :-( и vi выдает ошибку «Tmp file too large».
Hemant

1
@Hernant: Это сообщение говорит вам все, что вам нужно знать о редактировании на месте: vi пытается скопировать его в / tmp для дальнейшей работы. Я думаю, что vim сделает то же самое, и ему нравится создавать резервную копию в том же каталоге.
Дэвид Торнли

Ответы:


10

Попробуйте использовать hexedit. Я не пробовал его в HP-UX, но он должен работать. Это позволяет вам перейти к месту в файле и обрезать. Я уверен, что он не читает весь файл, а просто ищет подходящее место для отображения.

Использование довольно просто, как только вы запустите его, клавиши со стрелками позволяют перемещаться. F1 дает помощь. Ctrl-G перемещается к месту в файле (подсказка: чтобы перейти к концу, используйте размер файла из нижней строки дисплея). Поместите курсор на первый байт, который вы хотите обрезать, и затем нажмите Escape T, как только вы подтвердите, что усечение будет выполнено. Ctrl-x выходит.



6

Вы можете использовать дд например:

dd if=yourfile of=outname bs=4k count=thefirstX4kb

1
Спасибо за ваш ответ. Я предпочитаю редактировать файл на месте, чтобы сэкономить место на диске. Если ничего не поможет, я буду использовать dd :-).
Hemant

6

Используйте инструмент, который дает вам доступ к truncateсистемному вызову. Вы можете сделать это только с помощью инструментов POSIX. Предупреждение, набранное в браузере; будьте особенно осторожны, так как ddошибки еще более беспощадны, чем обычная команда unix. 123456 - это количество байтов для хранения.

dd if=/dev/null of=/file/to/truncate seek=1 bs=123456

Версия Perl гораздо более читабельна:

perl -e 'truncate "$ARGV[0]", 123456 or die $!' /file/to/truncate

1

Вы можете использовать splitили ed, awkили любой язык программирования.


Спасибо за ваш ответ. Я предпочитаю редактировать файл на месте, чтобы сэкономить место на диске и память.
Hemant
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.