Linux / 명령어 / mktemp - 안전한 임시 파일과 디렉터리 생성

mktemp는 예측하기 어려운 고유 이름으로 임시 파일이나 디렉터리를 원자적으로 생성하고 그 경로를 출력합니다. 프로세스 ID를 붙인 이름을 직접 만드는 방식보다 이름 충돌과 심볼릭 링크 경쟁 조건을 줄일 수 있습니다.

이 글에서는 템플릿 사용법, 임시 디렉터리 생성, TMPDIR와 위치 선택, 셸의 trap을 이용한 정리와 피해야 할 -u 사용법을 설명합니다.

mktemp 명령어란?

mktemp는 템플릿의 연속된 X를 임의 문자로 치환하고, 그 이름의 파일이나 디렉터리를 실제로 생성한 뒤 경로를 출력합니다. 템플릿을 지정하면 마지막 경로 구성 요소에 보통 3개 이상의 연속된 X가 필요합니다. 출력된 경로는 공백을 포함할 수 있으므로 항상 따옴표로 감싸 사용해야 합니다.

기본 문법

mktemp [옵션] [템플릿]

파일명이나 경로에 공백이 있으면 따옴표로 감싸고, 하이픈으로 시작하는 이름은 가능한 경우 -- 뒤에 지정합니다. 지원 옵션은 배포판과 GNU Coreutils 버전에 따라 다를 수 있으므로 mktemp --help와 man mktemp으로 현재 시스템의 설명을 확인하세요.

mktemp 기본 사용법

임시 파일 만들기

템플릿을 생략하면 시스템 임시 디렉터리 정책에 따라 고유 파일을 만들고 경로를 출력합니다.

tmp_file=$(mktemp) || exit 1
printf '%s\n' "$tmp_file"

이름 형식을 지정하기

마지막 연속된 X들이 고유 문자열로 바뀝니다. 확장자가 필요하면 템플릿 뒤에 붙이거나 --suffix를 사용합니다.

mktemp report-XXXXXXXX.csv
mktemp --suffix=.log app-XXXXXXXX

임시 디렉터리 만들기

-d는 파일 대신 현재 사용자만 접근 가능한 임시 디렉터리를 만듭니다. 더 제한적인 umask는 권한을 추가로 줄일 수 있습니다.

tmp_dir=$(mktemp -d) || exit 1
printf '%s\n' "$tmp_dir"

실제 생성 경로 확인하기

mktemp는 안전하게 생성한 임시 파일의 경로를 표준 출력으로 돌려줍니다. 이름을 추측해 만들거나 -u 결과만 믿지 마세요.

tmpfile=$(mktemp)
printf '%s\n' "$tmpfile"
test -f "$tmpfile"
echo $?

출력은 임시 경로 한 줄과 0입니다. 임시 경로의 문자열은 실행마다 다릅니다. 작업이 끝나면 정확히 생성한 파일인지 확인하고 따옴표로 감싼 변수 경로를 정리하세요.

주요 옵션

옵션 설명
-d, --directory 임시 파일 대신 디렉터리를 만듭니다.
-p DIR, --tmpdir=DIR 템플릿을 지정한 디렉터리를 기준으로 사용합니다.
--tmpdir 인수 없이 사용하면 TMPDIR 또는 기본 임시 디렉터리를 사용합니다.
--suffix=SUFFIX 생성 이름 뒤에 접미사를 붙입니다.
-q, --quiet 생성 실패 진단을 숨기지만 종료 상태는 유지합니다.
-u, --dry-run 이름만 출력하고 만들지 않습니다. 경쟁 조건 때문에 보안 용도로 사용하면 안 됩니다.

긴 옵션은 의미를 파악하기 쉽고 스크립트 검토에도 도움이 됩니다. 다만 이식성이 중요한 스크립트에서는 대상 시스템이 해당 GNU 확장 옵션을 지원하는지 먼저 확인하세요.

실전 활용 예제

trap으로 임시 파일 정리하기

생성 직후 종료 신호와 정상 종료에서 정리하도록 등록합니다. 변수는 따옴표로 감싸고 생성 실패 시 즉시 중단합니다.

tmp_file=$(mktemp) || exit 1
trap 'rm -f -- "$tmp_file"' EXIT HUP INT TERM

printf '%s\n' 'temporary data' > "$tmp_file"

임시 작업 디렉터리 사용하기

여러 중간 파일이 필요하면 임시 디렉터리 하나를 만든 뒤 그 안에 고정된 이름을 사용하면 관리가 쉽습니다.

work_dir=$(mktemp -d) || exit 1
trap 'rm -rf -- "$work_dir"' EXIT HUP INT TERM

input=$work_dir/input
output=$work_dir/output

원하는 부모 디렉터리 선택하기

같은 파일 시스템에서 원자적 이름 변경이 필요하거나 공간·보안 정책이 다른 경우 -p로 위치를 지정합니다. 디렉터리는 미리 존재해야 합니다.

mkdir -p "$HOME/.cache/myapp"
cache_file=$(mktemp -p "$HOME/.cache/myapp" cache-XXXXXXXX) || exit 1

mktemp와 관련 명령 비교

명령·방법 주요 역할 적합한 상황
mktemp 고유 이름을 만들고 즉시 항목 생성 안전한 임시 파일·디렉터리
touch 지정한 고정 이름의 파일 생성 충돌 위험이 없는 일반 파일
mkdir 지정한 고정 이름의 디렉터리 생성 영구적이거나 미리 정한 경로
mktemp -u 사용되지 않는 이름만 출력 보안 파일 생성에는 부적합

사용할 때 주의할 점

-u 결과로 파일을 만들지 않는다

이름을 출력한 뒤 실제 파일을 만드는 사이에 다른 프로세스가 같은 경로를 선점할 수 있습니다. 임시 파일은 -u 없이 mktemp가 직접 만들게 하세요.

정리 명령의 변수를 따옴표로 감싼다

빈 값이나 공백이 포함된 경로가 잘못 확장되면 엉뚱한 파일을 삭제할 수 있습니다. 생성 성공을 확인하고 rm -- "$변수"처럼 사용하세요.

민감한 데이터의 저장 위치를 확인한다

임시 디렉터리가 메모리 파일 시스템인지 디스크인지, 백업·스왑·스냅샷에 포함되는지는 시스템마다 다릅니다. 민감한 데이터 정책을 별도로 확인하세요.

FAQ

프로세스 ID를 붙인 임시 파일명보다 mktemp가 안전한 이유는 무엇인가요?

예측하기 어려운 이름을 선택하고 파일 생성까지 한 단계에서 수행해 이름 선점과 심볼릭 링크 경쟁 조건을 줄이기 때문입니다.

임시 디렉터리를 만들려면 어떻게 하나요?

mktemp -d를 사용하고 반환된 경로를 변수에 저장한 뒤 따옴표로 감싸 사용하세요.

생성한 임시 파일은 자동으로 삭제되나요?

일반적으로 자동 삭제되지 않습니다. 셸 스크립트에서는 trap으로 종료 시 정리하도록 등록하세요.

TMPDIR은 언제 사용되나요?

--tmpdir 사용이나 기본 템플릿 동작에서 임시 파일을 둘 위치를 선택하는 데 사용될 수 있습니다. 실제 동작은 설치된 버전의 도움말로 확인하세요.

관련 글과 공식 문서

같은 카테고리의 다른 글
Linux / 명령어 / jobs - 현재 셸의 작업 목록 확인

Linux / 명령어 / jobs - 현재 셸의 작업 목록 확인

Linux jobs 명령어의 기본 문법과 실제 사용 예제를 설명합니다. 주요 옵션과 결과를 해석할 때 주의할 점을 확인할 수 있습니다.

Linux / 명령어 / file - 파일 종류와 형식 확인

Linux / 명령어 / file - 파일 종류와 형식 확인

Linux file 명령어로 확장자와 관계없이 실제 파일 형식, MIME 유형과 문자 인코딩을 확인하는 방법을 설명합니다. 심볼릭 링크, 압축 파일, 여러 파일 검사와 스크립트 활용법도 정리합니다.

Linux / 명령어 / nslookup - DNS 이름과 레코드 조회

Linux / 명령어 / nslookup - DNS 이름과 레코드 조회

Linux nslookup 명령어의 기능과 기본 문법을 설명합니다. 실제 사용 예제, 주요 옵션과 작업 전 확인할 점을 알아봅니다.

Linux / 명령어 / less - 긴 파일을 검색하며 페이지 단위로 보기

Linux / 명령어 / less - 긴 파일을 검색하며 페이지 단위로 보기

Linux less 명령어로 긴 텍스트와 명령 출력을 페이지 단위로 탐색하는 방법을 설명합니다. 검색, 이동, 실시간 갱신과 파이프 사용법을 정리합니다.

Linux / 명령어 / systemctl - systemd 서비스 상태 확인과 관리

Linux / 명령어 / systemctl - systemd 서비스 상태 확인과 관리

Linux systemctl 명령어의 기능과 기본 문법을 설명합니다. 실제 사용 예제, 주요 옵션과 작업 전 확인할 점을 알아봅니다.

Linux / 명령어 / nohup - 로그아웃 후에도 명령 계속 실행

Linux / 명령어 / nohup - 로그아웃 후에도 명령 계속 실행

Linux nohup 명령어로 로그아웃 후에도 작업을 계속 실행하는 방법을 설명합니다. 백그라운드 실행, 입출력 리디렉션, PID 확인과 종료, 로그 관리 및 systemd·tmux와의 차이를 정리합니다.

Linux / 명령어 / unzip - ZIP 파일 목록 확인과 안전한 압축 해제

Linux / 명령어 / unzip - ZIP 파일 목록 확인과 안전한 압축 해제

Linux unzip 명령어의 용도와 기본 문법을 알아봅니다. 파일 처리 예제, 주요 옵션과 원본 보존·덮어쓰기 주의점을 설명합니다.

Linux / machine-id 확인 방법과 시스템 복제 시 주의사항

Linux / machine-id 확인 방법과 시스템 복제 시 주의사항

machine-id의 역할과 확인 방법, 복제용 이미지에서 파일을 삭제·비우거나 uninitialized로 설정할 때의 차이를 설명합니다. 운영 중인 서버의 ID 중복을 안전하게 처리하기 위한 점검 사항도 다룹니다.

Linux / 명령어 / tmux - 터미널 세션 분리·재접속

Linux / 명령어 / tmux - 터미널 세션 분리·재접속

Linux tmux 명령어의 기본 문법과 실제 사용 예제를 설명합니다. 주요 옵션과 결과를 해석할 때 주의할 점을 확인할 수 있습니다.

Linux / 명령어 / mv - 파일 이동과 이름 변경

Linux / 명령어 / mv - 파일 이동과 이름 변경

Linux mv 명령어로 파일과 디렉터리를 이동하거나 이름을 변경하는 방법을 설명합니다. 덮어쓰기 방지, 파일 시스템 간 이동과 안전한 자동화 방법도 정리합니다.