Как удалить X байтов из конца большого файла, не читая весь файл? - PullRequest
17 голосов
/ 12 сентября 2011

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

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

Редактировать

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

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

Ответы [ 5 ]

28 голосов
/ 12 сентября 2011

использовать функцию truncate

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

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

усечение принимает имя файла
ftruncate принимает дескриптор открытого файла

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

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

**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

[/ edit]

15 голосов
/ 22 июля 2016

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

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

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

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

truncate --size=-314 target_file.bin

4 голосов
/ 09 марта 2017

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

  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

4 голосов
/ 12 сентября 2011

как насчет команды truncate?

http://linux.about.com/library/cmd/blcmdl2_truncate.htm

2 голосов
/ 12 сентября 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...