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

18

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

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

Hemant
источник
Я думаю, что 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 выходит.

Richm
источник
14

Вырезать 2 килобайта из конца файла:

truncate -s-2K file
Мацей Печотка
источник
6

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

dd if=yourfile of=outname bs=4k count=thefirstX4kb
maxschlepzig
источник
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