Файл Linux содержит «@ ^ @ ^ @ ^ @», как восстановить?

1

Я только что закончил писать большой код на c, но когда я сохраняю и открываю снова, файл содержит странные символы: "@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^ @^@^@^@^@0000664^@0001750^@0001750^@0000000031"

Как я могу восстановить файл?

Я пишу эту программу весь день. : ((

flatronka
источник
2
Вы должны были использовать систему контроля
версий
8
Вы чем-нибудь изменились gcc bla.c -o bla.c?
sepp2k
Может быть, есть еще файл подкачки?
Злой салат
спасибо за ответы, я не знаю, что случилось, я просто вышел из VIM и снова открыть.
Flatronka
2
Вы печатаете file big.c- что это говорит? К сожалению, не очень подходит для восстановления.
Левон

Ответы:

8

Это может быть длинный выстрел, но это выглядит подозрительно как часть заголовка файла TAR. Возможно, вы когда-то пытались сделать резервную копию с помощью tar и использовали то же имя файла, что и выходной файл? Я подозреваю, что причина в том, что заголовок файла TAR начинается с:

 char filename[100];  // null padded
 char mode[8]; // octal
 char nuid[8]; // octal
 char ngud[8];
 char size[12];
 ...

Итак, глядя на этот фрагмент, он соответствует шаблону - файл был rw-rw-r, с идентификатором владельца / группы 1000 и размером от 200 до 207 байт (похоже, что это поле вырезано в вашем cut-n- вставить). Выдача - если в файле есть «ustar», начинающийся с символа 257. В этом случае просто используйте команду tar, чтобы попытаться извлечь из нее (во временном каталоге на всякий случай), надеюсь, вы получите что-то из Это.

Дерек Прессналл
источник
Как сказал @Levon, вы можете попытаться file source.cувидеть, распознает ли он его как файл tar. Вы могли бы сделать tar -tvf source.cне разрушительно
Rich Homolka
Есть большая вероятность, что это не будет восстановлено, если это так - tar открывает свой выходной файл до того, как прочитает свои входные файлы, поэтому данные будут удалены к тому времени, когда они туда
попадут
я не использую команду tar. Я скопировал этот код из середины файла, а не beging.
flatronka
Если вы абсолютно уверены, что не сделали ничего конкретного, что могло бы объяснить это, скорее всего, у вас есть серьезное повреждение файловой системы (хотя раньше я не видел этой конкретной ошибки, когда один файл содержит содержимое другого файла). Если это так, то я бы посоветовал сделать резервную копию того, что у вас есть, размонтировать файловую систему и запустить fsck против нее, прежде чем пытаться полагаться на нее дальше. Но я могу заверить вас, что опубликованный вами фрагмент почти наверняка взят из резервной копии tar.
Дерек Прессналл
2

Перед выходом из Vim введите

:e! your_file_path

попытаться загрузить файл. Это на тот случай, если вы просто попытались отредактировать неправильный файл.

В другой оболочке найдите файл your_filename.recover или file_name.swp. Если найден, то начинается

vim -r file_name

должен вернуть ваш файл.

starbolin
источник
спасибо, но это не сработало :(
flatronka
1

Несколько раз я сталкивался с этим персонажем в файлах журналов. Многие люди называют их «дырой» в файле, где существует некоторое несоответствие между фактическим объемом данных в файле и его указанным размером. Как я узнал из своего очень небольшого исследования по этому вопросу, это происходит из-за проблемы с синхронизацией, когда над файлом одновременно выполняется более одной операции или когда в момент записи файла встречается некоторый перерыв в пространстве на диске. отослать это и это

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

Мне действительно очень жаль вас, потому что я знаю, как больно терять что-то, на что вы потратили целый день (наряду с вашими любимыми усилиями, вашей страстью и энергией), но шансы очень кроткие, что вы сможете их восстановить . :(

mawia
источник
0

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

Келли
источник
Спасибо за весь ответ, я закончил переписывать код. :)
flatronka
0

^ @ - это двоичный ноль, низкие значения, '\ 0', 0x00. Лучше всего предположить, что у вас есть строка с нулевым разделителем, и вы пишете длину charмассива, а не используете strlen.

cdarke
источник
Он говорит о своем исходном коде, который каким-то образом поврежден, а не выводится из его программы.
Боб