Я использую truncate
для файла, чтобы проверить поведение моего программного обеспечения на неполных файлах, оно неожиданно отключается. Я начал копать и оказался здесь.
>cp full truncated
>truncate -s 2485129215 truncated
>ls -la
-rw-r--r-- 1 yuki yuki 2485129215 Mar 6 14:30 truncated
-rw-r--r-- 1 yuki yuki 2485129216 Mar 6 14:24 full
Я ожидаю, что это даст truncated
, идентичный full
без последнего байта. Но нет, я запустил xxd
на этих и сравнил с diff
- много гигабайт различий, которые трудно понять.
Я написал программу сравнения немых байтов в python.
import os
f1 = open('./full', 'r')
f2 = open('./truncated', 'r')
s1 = os.stat('./full').st_size
s2 = os.stat('./truncated').st_size
print('size1 {}'.format(s1))
print('size2 {}'.format(s2))
s = min(s1, s2)
print('min={}'.format(s))
i = 0
while i < s:
b1 = f1.read(1)
b2 = f2.read(1)
if b1 != b2:
print("{} {:02x} != {:02x}".format(i, ord(b1[0]), ord(b2[0])))
break
i += 1
возвращает
size1 2485129216
size2 2485129215
min=2485129215
1288204320 44 != e8
Ок, попытался посмотреть с xxd
>xxd -o 1288204320 -l 5 ./full
4cc87020: 2a00 0000 00 *....
не похоже на это ... Запустите это
>xxd -o 1288204319 -l 5 ./full
4cc8701f: 2a00 0000 00
Шутки в сторону? Почему он выглядит идентично предыдущему?
Что не так с linux инструментами, или я использую его? Я на штатной Ubuntu 18.04. Может ли быть так, что truncate
и xxd
принимают только какие-то младшие числа и в противном случае переполняются? Есть идеи?
Кстати, запуск head -c 2485129215 full > truncated
дает ожидаемый результат. Houray! По крайней мере, что-то работает.