리눅스에서 잘못 만들어진 파일 삭제하기 – 하이픈(-) 때문에 안 지워질 때
리눅스를 쓰다 보면, 실수로 이상한 이름의 파일을 만들 때가 있습니다.
특히 파일 이름이 하이픈(-)으로 시작하는 경우가 문제인데요.
예를 들어, 아래처럼 프로필 옵션을 잘못 실행해서 파일이 만들어졌다고 해봅시다.
-Dspring.profiles.active=prod
이런 파일을 지우려고 단순히 rm -Dspring.profiles.active=prod를 입력하면, rm 명령은 이 파일명을 “옵션”으로 오해합니다. 그래서 삭제가 안 되고 에러가 뜹니다.
"""
rm: illegal option -- D
usage: rm [-f | -i] [-dIPRrvWx] file ...
unlink [--] file
"""
다음같은 명령어도 정상 수행이 안되죠
rm *Dsp*
왜 이런 일이 생길까요?
리눅스 명령어는 보통 **하이픈(-)**으로 시작하면 옵션이라고 판단합니다.
예를 들어 rm -f에서 -f는 force delete라는 옵션이죠.
문제는, 파일 이름도 하이픈으로 시작하면 같은 규칙이 적용되어 **“옵션인지 파일인지”**를 구분하지 못하는 겁니다.
해결 방법 1 "- -"로 옵션 해제
리눅스에는 "여기서부터는 옵션이 아니라 파일 이름"이라는 신호를 주는 **--**라는 표준 문법이 있습니다.
이걸 쓰면 아주 깔끔하게 해결됩니다.
rm -- -Dspring.profiles.active=prod
해결 방법 2 – inode 번호로 삭제
혹시 파일명이 너무 이상해서 입력이 어려운 경우, inode 번호를 이용해 삭제할 수 있습니다.
1. ls -i로 inode 번호 확인
2. find로 해당 inode 삭제
find . -inum [inode번호] -delete
이 방법은 이름이 깨진 파일이나 특수문자가 너무 많은 파일에도 유용합니다.
리눅스에서 이런 상황을 겪으면 당황하기 쉽지만, 사실 방법은 단순합니다.
하이픈(-) 때문에 삭제가 안 되는 파일이 있다면, 위 방법 중 하나만 기억해 두면 금방 해결할 수 있습니다.
문제는 해결 되었지만, 혹시나 inode가 뭐야?
라고 생각하시는 분들이 계실 것 같아서 정리했습니다.
inode는 리눅스·유닉스 계열 파일 시스템에서 파일의 ‘메타데이터’를 담고 있는 구조체입니다.
쉽게 말하면, 파일을 설명하는 주민등록번호 라고 보시면 됩니다.
inode에 들어있는 정보
- 파일이 저장된 디스크 블록의 위치
- 파일 크기
- 파일 권한 (읽기/쓰기/실행 가능 여부)
- 소유자와 그룹
- 생성 시간, 수정 시간, 접근 시간
- 하드링크 개수
- 파일 종류(일반 파일, 디렉토리, 심볼릭 링크 등)
파일명은 inode에 들어있지 않습니다.
파일명은 디렉토리 엔트리에 따로 저장되고, 그 엔트리가 해당 파일의 inode 번호를 가리키는 방식 입니다.
아래 다이어그램을 참고하시면 더 쉽습니다.
[ 디렉토리 ]
┌─────────────────────────┐
│ 파일명: hello.txt ─────┼───> inode 번호: 101
│ 파일명: data.log ─────┼───> inode 번호: 102
│ 파일명: weird-file ─────┼───> inode 번호: 103
└─────────────────────────┘
[ inode 테이블 ]
┌─────────┬──────────────────────────────┐
│ inode101│ 크기: 15KB │
│ │ 소유자: user │
│ │ 권한: rw-r--r-- │
│ │ 블록 위치: [5001, 5002] │
└─────────┴──────────────────────────────┘
┌─────────┬──────────────────────────────┐
│ inode102│ 크기: 2MB │
│ │ 소유자: root │
│ │ 권한: rw------- │
│ │ 블록 위치: [5100, 5101, 5102] │
└─────────┴──────────────────────────────┘
┌─────────┬──────────────────────────────┐
│ inode103│ 크기: 1KB │
│ │ 소유자: user │
│ │ 권한: rwxr-xr-x │
│ │ 블록 위치: [5200] │
└─────────┴──────────────────────────────┘
[ 실제 데이터 블록 ]
5001 → "Hello "
5002 → "World!"
5100 → (로그 내용)
- 디렉토리는 파일명과 inode 번호만 매핑합니다. (이름 → 번호)
- inode는 파일의 메타데이터와 실제 데이터가 저장된 블록 위치를 기록합니다.
- 데이터 블록에는 실제 파일 내용이 들어 있습니다.