본문 바로가기
카테고리 없음

리눅스 잘못 만들어진 파일 삭제하는 방법 illegal option

by techdebt 2025. 8. 12.
반응형

리눅스에서 잘못 만들어진 파일 삭제하기 – 하이픈(-) 때문에 안 지워질 때

리눅스를 쓰다 보면, 실수로 이상한 이름의 파일을 만들 때가 있습니다.
특히 파일 이름이 하이픈(-)으로 시작하는 경우가 문제인데요.

예를 들어, 아래처럼 프로필 옵션을 잘못 실행해서 파일이 만들어졌다고 해봅시다.

-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는 파일의 메타데이터와 실제 데이터가 저장된 블록 위치를 기록합니다.
  • 데이터 블록에는 실제 파일 내용이 들어 있습니다.