대답은 "그렇습니다. 그러나 파일 시스템 유형 및 타이밍에 따라 다릅니다."
이 세 가지 예제 중 어느 것도 우연히 제외하고 old_file 또는 existing_file의 물리적 데이터 블록을 덮어 쓰지 않습니다.
mv new_file old_file
. 그러면 old_file이 연결 해제됩니다. old_file에 대한 추가 하드 링크가 있으면 나머지 링크에서 블록이 변경되지 않습니다. 그렇지 않으면 블록은 일반적으로 사용 가능한 목록에 배치됩니다 (파일 시스템 유형에 따라 다름). 그런 다음 mv
복사 가 필요한 경우 (디렉토리 항목 이동과 반대) 새 블록이 mv
쓰기 로 할당됩니다 .
새로 할당 된 이러한 블록 은 방금 해제 된 블록 과 동일하거나 아닐 수 있습니다 . UFS 와 같은 파일 시스템에서는 가능한 경우 파일이 작성된 디렉토리와 동일한 실린더 그룹에서 블록이 할당됩니다. 따라서 디렉토리에서 파일을 링크 해제하고 동일한 디렉토리에 파일을 작성할 가능성이 있습니다 ( 덮어 쓰기) 방금 해제 된 동일한 블록 중 일부. 따라서 실수로 파일을 제거하는 사람들에게 표준 조언은 누군가 파일 복구를 시도 할 때까지 디렉토리 트리의 파일에 새 데이터를 쓰지 않는 것이 좋습니다 (전체 파일 시스템이 아닌 것이 좋습니다).
cp new_file old_file
다음을 수행합니다 ( strace
시스템 호출을 보는 데 사용할 수 있음 ).
open ( "old_file", O_WRONLY | O_TRUNC) = 4
O_TRUNC 플래그는 mv
위에서 와 같이 모든 데이터 블록이 해제되도록합니다 . 위와 같이, 이들은 일반적으로 사용 가능 목록에 추가되며 cp
명령에 의해 수행 된 후속 쓰기에 의해 재사용되거나 재사용되지 않을 수 있습니다 .
vi existing_file
. 경우 vi
실제로 vim
는 :x
명령은 다음을 수행합니다
unlink ( "existing_file ~") = -1 ENOENT (파일 또는 디렉토리가 없음)
rename ( "existing_file", "existing_file ~") = 0
open ( "existing_file", O_WRONLY | O_CREAT | O_TRUNC, 0664) = 3
따라서 이전 데이터를 제거하지도 않습니다. 데이터는 백업 파일에 보존됩니다.
FreeBSD에서는 vi
does open("existing_file",O_WRONLY|O_CREAT|O_TRUNC, 0664)
와 같은 의미를 갖습니다 cp
.
특별한 프로그램없이 일부 또는 모든 데이터를 복구 할 수 있습니다. 필요한 것은 grep
및 dd
이며 원시 장치에 대한 액세스입니다.
작은 텍스트 파일의 경우 링크 된 질문 에서 @Steven Dgrep
의 답변에 단일 명령 이 가장 쉬운 방법입니다.
grep -i -a -B100 -A100 'text in the deleted file' /dev/sda1
그러나 연속되지 않은 여러 블록에있을 수있는 더 큰 파일의 경우 다음과 같이하십시오.
grep -a -b "text in the deleted file" /dev/sda1
13813610612:this is some text in the deleted file
일치하는 줄의 오프셋을 바이트 단위로 제공합니다. 다음으로 dd
시작 하는 일련의 명령으로이를 수행하십시오.
dd if=/dev/sda1 count=1 skip=$(expr 13813610612 / 512)
또한 해당 블록 전후에 일부 블록을 읽으려고합니다. UFS에서 파일 블록은 일반적으로 8KB이며 일반적으로 상당히 연속적으로 할당됩니다. 단일 파일 블록은 다른 파일 또는 여유 공간의 8KB 블록과 교대로 인터리브됩니다. UFS에서 파일의 꼬리는 최대 7 개의 1KB 조각으로, 인접하거나 인접하지 않을 수 있습니다.
물론, 데이터를 압축하거나 암호화하는 파일 시스템에서 복구는 간단하지 않을 수 있습니다.
Unix에는 실제로 기존 파일의 데이터 블록을 덮어 쓰는 유틸리티가 거의 없습니다. 생각 나는 것은 dd conv=notrunc
입니다. 다른 하나는 shred
입니다.