첫출발
Pain point :
회사에서는 윈도 환경의 노트북을 사용하고 있으나, 집에서는 MacOS 환경의 맥북을 사용하고 있습니다.
그런데 집 맥북으로 만든 ppt 파일이나 참고 pdf 문서들을 외장 SSD에 저장한 후에, 회사 윈도 노트북에 SSD를 연결하여 파일탐색기로 살펴보면 '.'으로 파일명이 시작하는 수없이 많은 파일과 디렉터리들이 생겨난 것을 보게 되는데 무척 신경이 쓰여서 대개는 파일 다중선택을 하여 삭제합니다. 이를 자동화해 주는 프로그램이 없을까 살펴보았는데 찾을 수 없었습니다. 그래서 생애 최초로 프로그램을 작성하기로 하였습니다.
개발 언어 및 환경 설정 :
개발 언어는 그나마 무경험자에게 쉬운 Python으로 하기로 하였습니다.
1. Python 설치 https://www.python.org/
- PIP 설치는 Python 설치 시에 함께 설치되도록 선택했고, path도 등록되도록 옵션을 선택하였습니다.
Prompt :
Windows11에서, '.'로 파일명이 시작하는 파일들을 현재 디렉터리뿐만 아니라 그 모든 하부 디렉터리에 있는 파일들까지 자동으로 삭제하는 실행 파일을 만들려고 해. 이를 위한 코드를 만들어 줄 수 있어?
import os
def delete_dot_files(root_dir):
for dirpath, dirnames, filenames in os.walk(root_dir):
for filename in filenames:
if filename.startswith('.'):
file_path = os.path.join(dirpath, filename)
try:
os.remove(file_path)
print(f"Deleted: {file_path}")
except Exception as e:
print(f"Failed to delete {file_path}: {e}")
if __name__ == "__main__":
root_directory = os.getcwd() # 현재 디렉터리를 root로 설정
delete_dot_files(root_directory)
ChatGPT가 만들어 준 source 뿐만 아니라, 실행파일로 만들기 위해서는 pyinstaller를 설치해야 한다고 해서 제시한 코드를 따라 설치하였습니다.
pip install pyinstaller
점점 더 구체적인 요건으로
그런데 어느 디스크 또는 디렉터리의 파일을 정리할 것인지를 지정하는 것을 잊었음이 떠올랐습니다. 그래서 다음과 같이 조금 구체적인 요청을 하였습니다.
Prompt :
현재 작업 디렉터리 대신에 실행파일 다음에 파라미터로 입력을 받은 디렉터리와 그 모든 하부 디렉터리의 '.'로 시작하는 파일들을 삭제할 수 있도록 코드를 변경해 줘.
import os
import sys
def delete_dot_files(root_dir):
for dirpath, dirnames, filenames in os.walk(root_dir):
for filename in filenames:
if filename.startswith('.'):
file_path = os.path.join(dirpath, filename)
try:
os.remove(file_path)
print(f"Deleted: {file_path}")
except Exception as e:
print(f"Failed to delete {file_path}: {e}")
if __name__ == "__main__":
if len(sys.argv) != 2:
print("Usage: python delete_dot_files.py <directory>")
sys.exit(1)
root_directory = sys.argv[1]
if not os.path.isdir(root_directory):
print(f"The directory {root_directory} does not exist.")
sys.exit(1)
delete_dot_files(root_directory)
그런데 제대로 삭제되지 않았습니다. 이유를 생각해 보니 대개 숨겨진 파일들이었습니다. 그래서 다시 조금 더 구체적인 요청을 하였습니다.
Prompt :
모든 숨겨진 파일도 삭제하도록 코드를 변경해 줘
그랬더니 'Windows에서는 ctypes 모듈을 사용하여 파일 속성을 체크할 수 있다면서 그 코드를 추가했습니다.
import os
import sys
def delete_dot_files(root_dir):
for dirpath, dirnames, filenames in os.walk(root_dir):
for filename in filenames:
if filename.startswith('.'):
file_path = os.path.join(dirpath, filename)
try:
os.remove(file_path)
print(f"Deleted: {file_path}")
except Exception as e:
print(f"Failed to delete {file_path}: {e}")
if __name__ == "__main__":
if len(sys.argv) != 2:
print("Usage: python delete_dot_files.py <directory>")
sys.exit(1)
root_directory = sys.argv[1]
if not os.path.isdir(root_directory):
print(f"The directory {root_directory} does not exist.")
sys.exit(1)
delete_dot_files(root_directory)
그런데, '.'가 붙어서 복잡하게 만드는 것은 파일뿐만 아니라, 디렉터리들이 많았습니다. 그래서 다시 요청을 했습니다.
Prompt :
'.'로 시작하는 파일뿐만 아니라 디렉터리까지 삭제하도록 코드를 수정해 줘.
import os
import sys
import ctypes
from ctypes import wintypes
import shutil
# Windows API를 사용하여 파일 속성을 가져오는 함수
def is_hidden(filepath):
FILE_ATTRIBUTE_HIDDEN = 0x02
attrs = ctypes.windll.kernel32.GetFileAttributesW(wintypes.LPWSTR(filepath))
return attrs != -1 and (attrs & FILE_ATTRIBUTE_HIDDEN)
def delete_dot_files_and_dirs(root_dir):
for dirpath, dirnames, filenames in os.walk(root_dir, topdown=False):
# 파일을 먼저 처리
for filename in filenames:
file_path = os.path.join(dirpath, filename)
if filename.startswith('.') or is_hidden(file_path):
try:
os.remove(file_path)
print(f"Deleted file: {file_path}")
except Exception as e:
print(f"Failed to delete file {file_path}: {e}")
# 디렉터리를 나중에 처리
for dirname in dirnames:
dir_path = os.path.join(dirpath, dirname)
if dirname.startswith('.') or is_hidden(dir_path):
try:
shutil.rmtree(dir_path)
print(f"Deleted directory: {dir_path}")
except Exception as e:
print(f"Failed to delete directory {dir_path}: {e}")
if __name__ == "__main__":
if len(sys.argv) != 2:
print("Usage: python delete_dot_files.py <directory>")
sys.exit(1)
root_directory = sys.argv[1]
if not os.path.isdir(root_directory):
print(f"The directory {root_directory} does not exist.")
sys.exit(1)
delete_dot_files_and_dirs(root_directory)
코드는 점점 길어졌지만, 기능 또한 점점 완성이 되었습니다.
실행 파일 만들기
pyinstaller를 사용하여 실행 파일을 만들었고, 잘 적용되는 것을 경험했습니다.
pyinstaller --onefile delete_dot_files.py
이를 실행하면, 그 디렉터리의 하부에 생기는 dist 디렉터리에 delete_dot_files.exe라는 단일 실행 파일을 생성합니다. 이 파일을 실행하여 스크립트를 수행할 수 있습니다.
파일구조 설명
다음은 chatGPT가 설명한 제 실행 파일의 소스 구조 분석입니다.
코드 설명
1. 모듈 임포트
- os: 운영 체제와 상호 작용하기 위한 모듈입니다. 파일 및 디렉터리 조작에 사용됩니다.
- sys: 파이썬 인터프리터와 관련된 기능을 제공합니다. 명령 줄 인자를 읽어오는 데 사용됩니다.
- ctypes: 외부 C 라이브러리를 호출하기 위한 모듈입니다. 여기서는 Windows API를 호출하는 데 사용됩니다.
- shutil: 파일 및 디렉터리디렉터리 작업을 위한 모듈입니다. 디렉터리 삭제에 사용됩니다.
2. 숨겨진 파일 확인 함수
- is_hidden(filepath): 주어진 파일이 숨겨져 있는지 확인하는 함수입니다.
- FILE_ATTRIBUTE_HIDDEN: 숨겨진 파일 속성의 값입니다.
- ctypes.windll.kernel32.GetFileAttributesW: Windows API를 사용하여 파일 속성을 가져옵니다.
- attrs != -1 and (attrs & FILE_ATTRIBUTE_HIDDEN): 파일 속성이 유효하고 숨겨진 속성을 갖고 있는지 확인합니다.
3. 파일 및 디렉터리 삭제 함수
- delete_dot_files_and_dirs(root_dir): 주어진 디렉토리와 모든 하위 디렉토리를 탐색하여 파일명이나 디렉토리명이 .로 시작하거나 숨겨진 파일과 디렉토리를 삭제하는 함수입니다.
- os.walk(root_dir, topdown=False): 디렉토리 트리를 하위 디렉토리부터 탐색합니다. topdown=False를 설정하여 하위 디렉토리부터 처리합니다.
- for filename in filenames: 현재 디렉토리의 파일들을 반복합니다.
- filename.startswith('.') or is_hidden(file_path): 파일명이 .로 시작하거나 숨겨진 파일인지 확인합니다.
- os.remove(file_path): 파일을 삭제합니다.
- for dirname in dirnames: 현재 디렉토리의 하위 디렉토리들을 반복합니다.
- dirname.startswith('.') or is_hidden(dir_path): 디렉토리명이 .로 시작하거나 숨겨진 디렉토리인지 확인합니다.
- shutil.rmtree(dir_path): 디렉토리와 그 하위 내용을 모두 삭제합니다.
4. 메인 실행 블록
- if __name__ == "__main__":: 이 블록은 스크립트가 직접 실행될 때만 실행됩니다. 모듈로 임포트될 때는 실행되지 않습니다.
- if len(sys.argv) != 2:: 명령 줄 인자의 수가 2가 아닌 경우 사용법을 출력하고 스크립트를 종료합니다.
- sys.argv는 명령 줄 인자의 리스트입니다. 첫 번째 인자(sys.argv[0])는 스크립트 이름이고, 두 번째 인자(sys.argv[1])는 사용자가 입력한 디렉토리입니다.
- root_directory = sys.argv[1]: 사용자가 입력한 디렉토리를 변수 root_directory에 저장합니다.
- if not os.path.isdir(root_directory):: 입력받은 디렉토리가 실제로 존재하는지 확인합니다. 존재하지 않으면 에러 메시지를 출력하고 스크립트를 종료합니다.
- delete_dot_files_and_dirs(root_directory): 지정된 디렉토리에서 파일명이나 디렉토리명이 .로 시작하거나 숨겨진 파일과 디렉토리를 삭제하는 함수를 호출합니다.
사용법 요약
- 위의 코드를 delete_dot_files.py라는 이름으로 저장합니다.
- 명령 프롬프트나 터미널을 열고 해당 파일이 위치한 디렉토리로 이동합니다.
- 다음 명령을 실행합니다:
php코드 복사python delete_dot_files.py <directory>mathematica코드 복사python delete_dot_files.
'Management > 일 잘하기' 카테고리의 다른 글
20시간 법칙. 1만 시간이 아닙니다. (0) | 2024.06.08 |
---|---|
윈도우에서 새 폴더 생성이 안 될 때 (0) | 2023.06.13 |
노션 - 아이콘 변경 (0) | 2023.05.08 |
chatGPT 관련 (0) | 2023.03.09 |
시스템 장애의 유형 DU vs. DL (0) | 2023.03.09 |
맥북에서 사라진 메뉴를 복원하는 방법 (0) | 2023.02.08 |