정말 멍청하게도 10개월 가량 피땀눈물 흘리며 작성한 코드가 들어있는 폴더를 통째로 삭제 해 버렸다.. 그것도 실수로..!
심볼릭 링크를 제거한다는 걸 경로를 잘못 입력해서 코드가 들어있는 폴더를 통째로 rm -r 명령어를 통해 날려 버렸다...
자책과 절망을 할 시간이 없었다. 이 삭제한 파일들이 완전히 날아가기 전에 복구를 해야 한다만 생각으로 알고 있는 명령어를 총 동원했다.
1. extundelete
Extundelete "device name" --resotre-directory "full path of a directory"
아주 예전에 빠른 시간 내에 위 명령어를 입력하면 복구가 됐었는데 난 안되었다..
2. debugfs
다음으로는 들어만 봤던 debugfs를 통해서 복구를 해 보려고 했으나 구글링과 gpt가 알려준 대로 했으나 복구가 되지 않았다.
3. testdisk
마지막으로 testdisk로 복구를 시도했지만 삭제된 파일 리스트에서 아무것도 뜨지 않아 복구를 할 수 없었다.
정말 이대로 날리는 건가 하고 절망하고 있을 때 우리의 gpt는 포기하지 않고 마지막 수단으로 photorec을 써 볼 것을 권했다.
그 결과 gpt가 알려준대로 photorec을 사용해서 복구를 할 수 있었다! gpt 만세 🙂↕️🙂↕️🙂↕️🙂↕️
아래는 그 험난했던 과정을 다시 반복하면 안되지만 언젠가 또 복구할 일이 생길 때 참고하기 위해 정리한 글이다.
시작에 앞서 rm 명령어로 날려버린 폴더에 아무런 행위도 하지 않아야 한다. 새로운 폴더를 생성한다던지 상위 폴더를 변경한다던지 등 삭제 된 그 상태 그대로 둬야 한다.
또, photorec으로 파일을 복구하게 되면 원시파일 형태로 복구 되기 때문에 파일명, 트리 구조가 유지 되지 않으며 과거 코드 수정 이력까지 파일로 복구 된다. (그래서 최후의 수단인 듯?)
1. testdisk 설치
sudo apt install testdisk
2. 삭제 된 폴더의 filesystem 확인
df -h
-> 삭제 된 폴더의 filesystem을 확인 해 준다.
나는 nvme에 저장 해 뒀던 폴더 하나를 날렸기 때문에 filesystem으로 /dev/nvme0n1p3를 입력 해 준다.
3. photorec 실행
sudo photorect /dev/nvme0n1p3
-> 해당 filesystem을 복구하겠다는 의미로 2번에서 확인한 filesystem을 명령어 뒤에 입력 해 주면 된다.
photorec을 실행하면 위 화면이 뜰텐데 입력한 filesystem(ext4)가 감지가 된 것을 확인할 수 있다.
/dev/nvme0n1p3가 ext4 파일 시스템이기 때문에 이를 포함하는 ext2/ext3에서 엔터를 눌러 선택하면 된다.
4. 복구할 파일 포맷 지정
3번 화면에서 넘어왔다면 위 화면이 뜰 것이다.
여기서 File Opt를 선택하면 PhotoRec이 추적하는 파일 포맷 리스트가 뜬다.
's'를 누르면 전체 해제가 되고 화살표 키로 이동하면서 원하는 확장자에서 '스페이스바'로 선택을 할 수 있다.
확장자 선택이 끝났다면 엔터키를 눌러 다시 위 화면으로 돌아올 수 있다.
나는 .py 파일을 복구하고자 했는데 .py 파일이 리스트에 없어서 .tx_로 시작하는 포맷들을 다 선택 해 줬다.
종종 .txt 파일 또는 .pyc 파일로 .py 파일이 복구 된다고 하길래 .pyc도 같이 선택 해 줬다.
5. 파일 복구
확장자 선택을 완료하면 위 화면이 뜨는데 다시 ext2/ext3을 선택 해주면 된다.
여기서 Free를 선택해야 선택한 확장자 파일들만 복구가 된다.
Whole을 선택하면 확장자 구별 없이 삭제 된 모든 파일들이 복구 된다. 굉장히 오래 걸리며 불필요한 파일들도 같이 복구 된다...!
이후 어떤 경로에다가 복구한 파일을 저장할지 선택하는데 기존 경로가 아니라 꼭 새로운 경로를 만들어서 해당 경로를 지정 해야 한다.
화살표 키를 이용해서 저장할 경로를 선택 한 후 엔터를 입력 해 주면 된다.
6. 파일 복구 시작
'c' 를 입력하면 복구가 시작된다.
7. 복구 완료
예상 소요 시간이 지나고 나면 복구가 완료 되고 완료되면 위와 같이 몇개의 파일이 어디로 복구 됐는지 알려 준다.
8. 복구 파일 확인
지정한 경로로 가면 복구한 파일들이 원시 파일 형태로 복구되어 있는 걸 볼 수 있다.
여기서 본인이 복구하고자 하는 파일이 어떤건지 이것저것 명령어를 사용해서 선별해야 한다.
나같은 경우엔 .py 포맷의 파일이었고 코드에 특정 단어를 하드 코딩 해뒀었기 때문에 이 두가지를 단서로 필요한 파일을 찾았다.
grep -ril --include="*.py" "특정문자"
이렇게 grep 명령어를 쓰면 해당하는 파일 리스트가 쭉 뜰 것이다.
나는 더 좋은 방법을 몰라 해당하는 파일 리스트들의 파일을 하나하나 vim으로 열어서 맞는지 확인 한 후 파일을 옮겨서 파일명을 수정해 주었다..!
우분투에서 rm으로 삭제한 파일 복구 완료!