안녕하세요. 이번 시간에는 shutil의 rmtree와 os의 rmdir에 대해서 간단하게 알아보겠습니다.

 


 먼저, rmtree는 폴더 안에 있는 내용들을 재귀적으로 삭제합니다.

 

 현재, 제 working directory에는 디렉토리 a와 디렉토리 b가 있습니다. 각각의 디렉토리 안에는 1.txt가 있어요. 여기서, 우리는 디렉토리 "a"에 있는 것들을 모두 삭제하려고 해요.

 

 이 때, shutil의 rmtree를 쓰시면 됩니다. test.py의 2번째 줄은, 디렉토리 a와 a 안에 있는 것들을 재귀적으로 삭제합니다. 뭔가 위험해 보이네요. 그런데, 3번째 줄에, shutil.rmtree.avoid_symlink_attacks가 있는데요. 이것을 출력하고 있어요.

 

 이 값이 True인 경우, 구현이 심볼릭 링크 공격을 방지함을 의미합니다.

 

 윈도우에서도 한 번 실행해 보겠습니다.

 

 실행 결과는 False가 나옵니다. 심볼링 링크 공격을 방지하지 않는다는 의미입니다. 플랫폼에 따라서, 심볼릭 링크 공격을 방지하는지, 그렇지 않은지가 나뉘게 됩니다. 이 점은 유념하셔야 하겠습니다.

 


 os의 rmdir도 디렉토리를 삭제합니다. 그런데, 디렉토리에 파일이나 다른 디렉토리가 있으면 안 됩니다. test2.py는 디렉토리 "b"를 삭제하려고 시도합니다.

 

 현재, 디렉토리 b 밑에는 1.txt가 있는데요. 비어 있지 않습니다. 그렇기 때문에, Directory not empty 라는 예외가 뜨면서 종료가 되어 버립니다. 

 대신에, b 밑에 있는 1.txt를 먼저 삭제한 다음에 os.rmdir("b")를 수행하면 성공적으로 수행됩니다. 이를 이용해서, 디렉토리가 진짜 비어 있는지 확인하는 안전 장치를 만들어 두어서 정말로 비었을 때에만 삭제하게끔 만들면 되겠네요. 무작정 shutil.remove로 재귀적으로 날리는 것은 위험하지 않을까 싶습니다.

 

 결과를 확인해 보면, 아까와는 다르게 디렉토리 b도 날라갔습니다. 이는 b 밑에 있던 1.txt라는 파일이 os.remove 함수 때문에 사라졌습니다. 다음에 디렉토리 b가 지워졌기 때문에, 빈 디렉토리인 b가 os.rmdir로 지워지게 됩니다. 그래서, a와 b가 사라지게 됩니다.