데이터를 복구하기 위해 파일의 끝을 읽습니다.


12

아주 오래된 .swp 파일은 편집중인 파일을 되돌 렸으므로 이제는 훨씬 짧아졌습니다. 그 디렉토리에서 아무것도하지 않았으므로 파일 끝 바로 뒤에 오는 바이트에는 여전히 내 데이터가 있어야합니다. 주어진 메모리 주소에서 N 바이트를 읽는 데 어떤 기능을 사용할 수 있습니까? dd그리고 read내가 옵션 곳을 놓친하지 않는 한, 파일 경계에서 중지합니다.

현재 파일 크기는 3.2KB입니다. 파일이 잘 리기 전에 얼마나 큰지 기억이 나지 않지만 10KB를 넘지 않아야합니다. 파일 경계를 무시하고 파일 시작 부분에서 10KB를 읽는 방법은 무엇입니까? 처음부터 시작할 필요가없는 한 데이터가 완벽하게 보존되지 않으면 괜찮습니다.

답변:


18

일반적으로 편집기는 파일을 저장할 때 삭제하거나 0으로 자르므로 할당 된 공간을 비운 다음 쓰기를 수행하여 새 공간을 할당합니다. 결과적으로 파일 시스템은 데이터를 완전히 다른 물리적 위치에 둡니다. 따라서 귀하의 아이디어가 효과가 없을 수 있습니다.

당신은 사용하여 파일의 물리적 위치를 얻을 수 있습니다 filefrag또는 hdparm --fibmap다음 사용할 dd직접 물리적 위치를 읽을 수 있습니다. /unix//a/85880/30851 에서 다른 프로세스 로이 프로세스를 설명했습니다.


귀하의 경우 텍스트 데이터를 찾는 일반적인 방법이 필요할 가능성이 더 큽니다.

strings -n 12 -t d /dev/partition | grep -F 'text snippet'

strings 연속 ASCII 데이터를 찾습니다 (UTF에 대해서는 잘 모르지만 다른 인코딩도 지원합니다. 코드 또는 영어 인 경우 필요하지 않음). 또한 찾은 오프셋을 인쇄합니다.

text snippet찾고있는 파일 부분에 [한 줄로] 기억하고있는 정확하고 고유 한 텍스트 샘플이어야합니다. (정확히 모른다면, 대신 정규 표현식으로 grep 할 수 있습니다.)

-n 12strings찾을 최소 길이입니다 . 12의 길이 여야합니다 text snippet. 이 매개 변수는 선택 사항입니다 (제공된 경우 strings | grep조금 더 빨리 진행하는 데 도움 이 될 수 있음) .

전체 파티션을 읽는 데 시간이 오래 걸리지 만 성공 dd하면 일반 영역을 잡고 공급 하지 않는 항목을 제거 할 수있는 오프셋이 생깁니다.

나는 그 디렉토리에서 아무것도하지 않았다.

만약 당신의 디렉토리가 마운트 포인트가되지 않는다면 ... 대부분의 파일 시스템은 실제로 "디렉토리마다"공간을 예약하지 않기 때문에 전체 파일 시스템의 모든 쓰기는 당신이 찾고있는 비트를 덮어 쓸 수 있습니다. 데이터 복구 상황에서는 일반적으로 전체 항목을 읽기 전용 모드로 전환합니다.


각 파일은 많은 블록에 저장되며 일반적으로 연속적으로 저장되지 않습니다. 그래서 strings당신은 매우 운이 아니라면 단지 파일의 일부를 찾습니다.
Gilles 'SO- 악마 그만해

3
정반대로, 조각난 10KB 파일을 찾으려면 매우 운이 없어야합니다. 부품 만 찾으면이 경우 다른 부품을 덮어 쓴 것 같습니다. 그러나 해당 파일 시스템에 쓰기 작업이 많거나 즉시 삭제 된 SSD 인 경우를 제외하고 편집 중에 해당 파일을 여러 번 저장 한 경우 해당 파일의 사본이 많이있을 수 있습니다.
frostschutz

3
나는 그것을 strings -n16더 빨리 만들기 위해 권장 하거나 합리적인 최소 길이입니다.
Peter Cordes

좋은 지적, 대답에 추가했습니다.
frostschutz

4
무리 감사. 파일 끝 부분을 지나친 쓰레기 만 있었지만 strings파티션의 다른 곳에서 전체 파일을 찾을 수있었습니다. 거의 두 달의 작업이 필요하지 않으며 중요한 작업에 항상 버전 제어를 사용한다는 훌륭한 알림입니다.
Matthew Bedford
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.