Rm (유닉스)
1. 개요
rm은 유닉스 및 유닉스 계열 운영체제에서 파일을 삭제하는 데 사용되는 명령어이다. 초기 버전에서는 빈 디렉토리만 삭제할 수 있었으나, 이후 옵션 추가를 통해 기능이 확장되었다. rm 명령어는 파일 및 디렉토리를 삭제하며, `-r` 옵션을 사용하면 디렉토리와 하위 내용을 재귀적으로 삭제할 수 있다. 실수로 인한 데이터 손실을 방지하기 위해 `-i` 옵션이나 셸 별칭을 사용하는 것이 권장되며, `rm -rf /`와 같은 명령은 시스템 전체를 삭제할 수 있으므로 사용에 주의해야 한다.
| 종류 | 명령어 |
|---|---|
| 사용법 | rm [옵션]... 파일... |
| 용도 | 파일을 지우는 데 사용 |
|---|---|
| 위험성 | 일반적으로, 삭제된 파일은 복구할 수 없다. rm 명령어를 신중하게 사용하지 않으면 데이터 손실이 발생할 수 있다. 특히, 루트 권한으로 사용할 경우 시스템에 심각한 손상을 초래할 수 있다. |
| -f, --force | 존재하지 않는 파일을 묻지 않고 무시한다. 쓰기 금지된 파일을 삭제하기 위해 프롬프트를 표시하지 않는다. -i 옵션을 덮어쓴다. |
|---|---|
| -i | 각 파일을 지우기 전에 확인 메시지를 표시한다. |
| -I | 세 개 이상의 파일을 지우거나 -r 또는 -R 옵션을 사용할 때 한 번만 확인 메시지를 표시한다. -i 옵션보다 덜 침해적이면서도 대부분의 실수를 방지한다. |
| --interactive[=언제] | 언제에 따라 각 파일을 지우기 전에 확인 메시지를 표시한다. |
| -r, -R, --recursive | 디렉터리 내용을 재귀적으로 지운다. |
| -d, --dir | 빈 디렉터리를 지운다. |
| -v, --verbose | 수행되는 작업을 설명한다. |
| --help | 도움말을 표시하고 종료한다. |
| --version | 버전 정보를 표시하고 종료한다. |
| 재귀적 삭제 | -r 또는 -R 옵션을 사용하여 디렉터리를 재귀적으로 삭제할 때 특히 주의해야 한다. 잘못된 경로를 지정하면 중요한 시스템 파일이 삭제될 수 있다. |
|---|---|
| 별칭 및 셸 함수 | rm 명령어에 대한 별칭이나 셸 함수를 정의하여 기본 동작을 변경할 수 있다. 예를 들어, 'rm'을 'rm -i'로 별칭 지정하여 삭제 전에 항상 확인 메시지를 표시하도록 할 수 있다. |
-
표준 유닉스 프로그램 -
AWK
AWK는 1977년에 개발된 텍스트 처리 및 프로그래밍 언어로, 유닉스 환경에서 텍스트 처리를 위해 설계되었으며 정규 표현식 처리 기능을 통해 텍스트 분석, 데이터 추출, 보고서 생성 등 다양한 작업을 수행한다. -
표준 유닉스 프로그램 -
Ls (유닉스)
`ls`는 유닉스 계열 운영체제에서 디렉터리 내 파일 및 디렉터리 목록을 표시하는 명령어로, 다양한 옵션을 통해 출력 형태, 정렬 방식, 추가 정보 표시를 제어하고, 파일 유형 구별, 숨김 파일 표시, 하위 디렉터리 재귀적 나열 등의 기능을 제공하며, 셸 별칭 설정을 통해 사용자 편의성을 높인다. -
유닉스 SUS2008 유틸리티 -
AWK
AWK는 1977년에 개발된 텍스트 처리 및 프로그래밍 언어로, 유닉스 환경에서 텍스트 처리를 위해 설계되었으며 정규 표현식 처리 기능을 통해 텍스트 분석, 데이터 추출, 보고서 생성 등 다양한 작업을 수행한다. -
유닉스 SUS2008 유틸리티 -
로케일
로케일은 소프트웨어 국제화 및 지역화에서 사용자 문화적 배경에 맞춰 사용 환경을 조정하는 설정으로, 표시 언어, 숫자/날짜 형식, 문자 분류, 통화 형식 등을 포함한다.
2. 역사
초기 유닉스 버전에서 `rm` 명령어는 빈 디렉터리만 삭제할 수 있었다. 버전 7에서는 삭제 전에 사용자에게 확인을 받는 `-i` 옵션이 도입되었는데, 이는 버전 1에 있던 `dsw` ("스위치에서 삭제") 명령어를 대체한 것이다. 더그 맥일로이는 `dsw`를 "말할 수 없는 이름을 가진 파일을 정리하기 위해 고안된 절망적인 도구"라고 묘사했다.
GNU coreutils에 포함된 `rm` 버전은 폴 루빈, 데이비드 매켄지, 리처드 스톨만, 짐 메이어링이 작성했다.
썬 마이크로시스템즈는 솔라리스 10에서 `rm -rf /` 실행을 방지하는 기능을 도입했으며, FreeBSD 등 다른 운영 체제에도 유사한 기능이 추가되었다. GNU `rm`은 `--preserve-root` 옵션을 통해 루트 디렉터리 삭제를 방지하는데, 이는 GNU Core Utilities 버전 6.4 (2006년)부터 기본적으로 활성화되어 있다.
3. 사용법
`rm` 명령어는 지정된 파일을 삭제하는 데 사용된다. 파일은 상대 경로 또는 절대 경로를 사용하여 지정할 수 있으며, `rm`은 기본적으로 디렉터리를 삭제하지 않는다. 예를 들어, `rm foo`는 현재 디렉터리에서 "foo" 파일을 삭제한다.
`rm`은 xargs와 함께 사용하여 삭제할 파일 목록을 지정할 수 있다.
```bash
xargs rm < filelist
```
위 명령어는 `filelist` 파일에 있는 목록을 읽어와 해당 파일들을 삭제한다.
현재 디렉터리 아래의 모든 디렉터리에서 모든 PNG 이미지를 제거하려면 다음과 같이 할 수 있다.
```bash
find . -name '*.png' -exec rm {} +
```
`rm` 명령을 심볼릭 링크에 사용하면 링크 자체는 삭제되지만, 링크가 가리키는 대상에는 영향을 미치지 않는다.
`rm`은 다양한 옵션과 함께 사용될 수 있다. 예를 들어 `-r` 옵션은 디렉터리와 그 안의 모든 내용을, `-i` 옵션은 삭제 전 확인, `-f` 옵션은 확인 메시지 없이 강제 삭제를 하는 데 사용된다.
mv (유닉스), cp (유닉스)와 마찬가지로 `rm` 명령에서 `-`(하이픈)으로 시작하는 파일 이름을 인수로 지정하려면 옵션의 종료를 알리는 `--`를 사용해야 한다. 예를 들어 `-f`라는 파일을 삭제하려면 `rm -- -f`와 같이 사용한다. 또는 경로명을 사용하여 `rm ./-f`와 같이 우회할 수도 있다.
3.1. 주요 옵션
* -r : 디렉터리와 그 안의 모든 내용을 재귀적으로 삭제한다. 즉, 디렉터리 안에 있는 파일과 다른 하위 디렉터리까지 모두 삭제한다. (recursive)
* -i : 파일을 삭제하기 전에 사용자에게 정말로 삭제할 것인지 확인하는 메시지를 표시한다. (interactive)
* -f : 존재하지 않는 파일을 무시하고, 삭제 확인 메시지를 표시하지 않는다. 즉, 오류 없이 강제로 삭제를 진행한다. (force) 단, 쓰기 보호 기능이 설정된 디렉터리 안에 있는 파일은 삭제할 수 없다.
* -v : 삭제 과정을 자세하게 출력하여, 어떤 파일이 삭제되고 있는지 사용자에게 알려준다. (verbose)
* -d : 빈 디렉터리를 삭제한다. 지정된 디렉터리가 비어있을 때만 작동한다.
* --one-file-system : 지정된 파일 시스템 내에서만 파일을 삭제하고, 마운트된 다른 파일 시스템은 무시한다.
* -- : 옵션의 끝을 명시한다. 이것은 `-`로 시작하는 파일 이름을 삭제할 때 유용하다. 예를 들어, `-f`라는 파일을 삭제하려면 `rm -- -f`와 같이 사용한다.
`rm`은 "rm -i"와 같이 alias하여 사용하는 경우가 많다. 이렇게 하면 실수로 파일을 삭제하는 것을 방지할 수 있다. 많은 양의 파일을 확인 없이 삭제하려면 `-f` 옵션을 추가하여 `-i` 옵션을 무시할 수 있다. (`rm -i -f`와 같이 두 옵션을 모두 지정하면 뒤에 오는 `-f` 옵션이 우선 적용된다.)
`rm -rf` (또는 `rm -rf /`, `rm -rf *` 등) 명령어는 유닉스 시스템에서 매우 위험한 명령으로 알려져 있다. 이 명령어를 슈퍼유저 권한으로 루트 디렉터리(`/`)에서 실행하면 시스템에서 쓰기 가능한 모든 파일이 삭제될 수 있기 때문이다.
3.2. 권한
파일을 삭제하려면 해당 파일의 상위 디렉터리에 대한 쓰기 권한이 필요하다. (그리고 디렉터리에 들어가기 위한 실행 권한도 필요하다). 파일 자체의 권한은 중요하지 않다. 그러나 GNU `rm`은 `-f` 옵션을 사용하지 않는 한, 쓰기 방지된 파일을 삭제할 때 확인을 요청한다.
`rm -r` 명령으로 디렉터리를 삭제하려면, 해당 디렉터리 및 모든 하위 디렉터리(있는 경우)에 대해 읽기, 쓰기 및 실행 권한이 필요하다. 읽기 권한은 삭제할 디렉터리의 내용을 나열하는 데 필요하다. 쓰기 권한이 없으면 내용을 삭제할 수 없어 비어 있지 않은 디렉터리는 삭제할 수 없지만, 동일한 디렉터리가 비어 있다면 삭제할 수 있는 상황이 발생한다.
스티키 비트가 설정된 디렉터리에 있는 파일을 삭제하려면 파일의 소유자여야 한다.
3.3. 주의 사항
rm영어 명령어 사용 시 주의해야 할 점은 다음과 같다.
* `rm -rf /` 또는 `rm -rf /*`: 이 명령어는 시스템 전체를 삭제할 수 있으므로 절대 사용해서는 안 된다. 슈퍼유저 권한으로 루트 디렉터리(`/`)에서 실행하면 파일 시스템에서 쓰기 가능한 모든 파일이 삭제되어 시스템이 망가진다. 픽사의 영화 토이 스토리 2 제작 중에도 이 명령어로 인해 많은 파일이 손실된 사례가 있다.
* 일부 [[리눅스 배포판]]의 보호 기능: 솔라리스 10, FreeBSD, GNU 코어 유틸리티 6.4 이상 버전에서는 `rm -rf /` 실행을 방지하는 기능이 있지만, 완벽하지 않으므로 주의해야 한다. 최신 시스템에서는 안전 장치가 기본 활성화되어 있지만, `--no-preserve-root` 옵션을 사용하면 우회할 수 있다.
* `-i` 옵션: 실수로 파일을 삭제하는 것을 방지하기 위해 `-i` 옵션을 사용하여 각 파일 삭제 전에 확인을 받는 것이 좋다.
* 셸 별칭: `alias rm="rm -i"`와 같이 셸 별칭을 설정하여 `rm` 명령어를 사용할 때마다 `-i` 옵션이 자동으로 적용되도록 하는 것이 일반적이다.
* `-`로 시작하는 파일 이름: `-`로 시작하는 파일을 삭제하려면 `--` 옵션을 사용하거나 (`rm -- -f`), 경로를 함께 지정해야 한다 (`rm ./-f`).
* 와일드카드(*) 사용 주의: 와일드카드(*)를 사용할 때는 특히 주의해야 한다. 잘못 사용하면 의도하지 않은 파일까지 삭제될 수 있다.
* 명령줄 인수 길이 제한: 명령줄 인수 길이가 제한을 초과하면 "Argument list too long" 오류가 발생할 수 있다. 이 제한은 최대 스택 제한의 25%이며, `ulimit -s` 명령으로 확인할 수 있다.
4. 기타
`rm`은 삭제된 파일을 복구하는 기능을 제공하지 않기 때문에, `undelete` 유틸리티를 사용하거나, 휴지통 기능을 제공하는 래퍼(wrapper)를 사용하는 것이 좋다.
썬 마이크로시스템즈는 솔라리스 10에서 " `rm -rf /` " 방지 기능을 도입했으며, FreeBSD의 `rm` 유틸리티에도 이 기능이 도입되었다. GNU coreutils 6.4 버전 이후로는 ` --preserve-root` 옵션이 기본값으로 설정되어, GNU `rm`은 `rm -rf /` 실행을 거부한다.
`rm`은 xargs와 함께 사용하여 파일 목록을 기반으로 파일을 삭제할 수 있다.
```bash
xargs rm < filelist
```
`find`와 함께 사용하여 특정 조건에 맞는 파일을 삭제할 수도 있다. 예를 들어, 현재 디렉터리 아래의 모든 디렉터리에서 모든 PNG 이미지를 제거하려면 다음과 같이 한다.
```bash
find . -name '*.png' -exec rm {} +
```
`rm` 명령어는 다음과 같은 다양한 운영 체제에 포팅되어 있다.