Подтвердить что ты не робот

Как удалить X-байты из конца большого файла без чтения всего файла?

В Linux у меня довольно большой файл с некоторой посторонней информацией, привязанной к концу. Скажем, например, я знаю, что в конце файла объемом 1,6 ГБ имеется 314 байтов посторонних данных.

Конечно, очень просто и эффективно добавлять больше данных в конец файла, но что я могу сделать, чтобы удалить его, не копируя первую часть этого файла в другую (или перезаписывая указанный файл)?

Edit

Я вижу хороший совет по этому поводу в C. Я надеялся на script его из командной строки, но в противном случае я был бы более склонен делать это в python, чем C.

Я вижу, что python имеет свой метод truncate в своем файловом объекте, но он, кажется, разрушает мой файл независимо от того, как я его использую - я должен уметь это понять, но, конечно, ответы более чем приветствуются.

4b9b3361

Ответ 1

используйте функцию truncate

http://linux.die.net/man/2/truncate

int truncate(const char *path, off_t length);
int ftruncate(int fd, off_t length); 

truncate принимает имя файла
ftruncate принимает открытый файловый дескриптор

оба из них устанавливают длину файла на length, чтобы он либо усекался, либо удлинялся (в последнем случае остальная часть файла будет заполнена NULL/ZERO)

[править]
truncate (команда linux shell) также будет работать

**SYNTAX**

truncate -s integer <filename>  
**OPTIONS**

-s number specify the new file length. If the new length is smaller than the current filelength data is lost. If the new length is greater the file is padded with 0. You can specify a magnitude character to ease large numbers:
b or B size is bytes.
k size is 1000 bytes.
K size is 1024 bytes.
m size is 10^6 bytes.
M size is 1024^2 bytes.
g size is 10^9 bytes.
G size is 1024^3 bytes.


**EXAMPLES**

To shrink a file to 10 bytes:

truncate -s 10 /tmp/foo

To enlarge or shrink a file to 345 Megabytes:

truncate -s 345M /tmp/foo

[/править]

Ответ 2

Хотя в этой теме было много ссылок на функцию truncate, никто не ответил на вопрос OP об уменьшении файла на фиксированную величину из среды сценариев. Ответ Кевина использовал truncate чтобы изменить размер целевого файла до фиксированного размера, но, конечно, правильность этого решения требует, чтобы пользователь сначала узнал размер целевого файла минус посторонние данные в конце. Итак, имеем:

   -s, --size=SIZE
          set or adjust the file size by SIZE bytes

Truncate самом деле поддерживает удаление данных из конца целевого файла напрямую, используя префикс SIZE с символом -.

Например, чтобы изменить размер файла на 314 байт, вы можете сделать:

truncate --size=-314 target_file.bin

Ответ 4

Лучше всего использовать "усечение", я просто привожу несколько примеров:

  1. У меня есть файл "PNav-h.db", он имеет 50176 байт.

    -rw-r--r--  1 user user 50176 Mar  8 23:43 PNav-h.db
     $truncate -s 1000 PNav-h.db
    

    он установил размер файла в 1000 байт

     -rw-r--r--  1 user user  1000 Mar  9 00:02 PNav-h.db
    
  2. В вашем случае используйте $truncate --size=xxx xxfilename, используя -<size number> чтобы уменьшить размер файла

    $truncate --size=-300 PNav-h.db
    -rw-r--r--  1 user user   700 Mar  9 00:07 PNav-h.db
    

    конечный размер файла = 1000-300 = 700

  3. используя +<size number> чтобы увеличить размер файла

    $truncate --size=+500 PNav-h.db
    -rw-r--r--  1 user user  1200 Mar  9 00:09 PNav-h.db
    

    конечный размер файла = 700 + 500 = 1200

  4. если нет - или +, это установить размер файла.

    $truncate --size=60000 PNav-h.db
    -rw-r--r--  1 user user 60000 Mar  9 00:12 PNav-h.db 
    

    конечный размер файла установлен на 60000

Ответ 5

В C в POSIX-совместимой системе (или, в более общем случае, в большинстве Unix-подобных систем) вы можете использовать функции truncate и ftruncate.