리눅스 touch 명령어 사용법 - 빈 파일 생성과 타임스탬프 변경
이 명령어를 언제 쓰는가
touch는 파일의 타임스탬프를 갱신하고, 파일이 없으면 빈 파일로 만든다. 실무에서 쓰는 순간은 세 가지다. 빈 로그·설정 파일을 미리 만들어 권한을 잡아 두기, 중복 실행 방지용 플래그 파일 만들기, 그리고 find -mtime이나 로테이션 조건을 테스트하기다.
"빈 파일 만들기"만 아는 상태로는 절반만 아는 것이다. 나머지 절반인 시각 조작(-t, -r)이 정리 스크립트를 검증할 때 쓸모가 있다.
기본 형식
touch [옵션] 파일 [파일 ...]
옵션이 없으면 접근 시각(atime)과 수정 시각(mtime)을 현재 시각으로 맞춘다. 파일이 없으면 크기 0으로 새로 만든다.
자주 쓰는 옵션
| 옵션 | 의미 | 예시 |
|---|---|---|
| -c | 파일이 없으면 만들지 않는다(갱신만) | touch -c /var/log/app.log |
| -m | 수정 시각만 변경 | touch -m data.csv |
| -a | 접근 시각만 변경 | touch -a data.csv |
| -t | 시각을 [[CC]YY]MMDDhhmm[.ss]로 지정 | touch -t 202601020304 old.log |
| -d | 사람이 읽는 형식으로 지정(GNU는 "2 days ago"도 가능) | touch -d '2026-01-02 03:04:05' old.log |
| -r 파일 | 다른 파일의 시각을 그대로 복사 | touch -r a.conf b.conf |
| -h | 심볼릭 링크 자체의 시각을 바꾼다(대상이 아니라) | touch -h current |
실전 예제
1) 로그 파일을 미리 만들고 권한을 잡는다 — 애플리케이션이 root로 첫 로그를 만들어 버리는 사고를 막는다.
touch /var/log/myapp/app.log
chown app:app /var/log/myapp/app.log
chmod 640 /var/log/myapp/app.log
2) 중복 실행 방지 플래그 — cron 배치가 겹쳐 도는 것을 막을 때 쓰는 가장 단순한 방법이다.
LOCK=/var/run/mybatch.lock
[ -e "$LOCK" ] && exit 0
touch "$LOCK"
trap 'rm -f "$LOCK"' EXIT
# 실제 작업
다만 이 방식은 검사와 생성 사이에 틈이 있다. 엄밀한 잠금이 필요하면 flock을 쓴다.
3) 정리 스크립트를 실제로 검증한다 — "30일 지난 로그 삭제"가 맞게 도는지 30일을 기다릴 수는 없다.
mkdir -p /tmp/t && cd /tmp/t
touch -d '40 days ago' old.log
touch -d '5 days ago' recent.log
find /tmp/t -name '*.log' -mtime +30 -print
# /tmp/t/old.log 만 나와야 정상이다
4) 배포한 파일들의 시각을 기준 파일에 맞춘다 — 빌드 산출물의 시각이 제각각일 때 정리한다.
touch -r /opt/app/current/VERSION /opt/app/current/*.jar
5) 여러 파일을 한 번에 만든다
touch /etc/myapp/{app,db,log}.conf
함정과 주의점
이미 있는 파일에 touch를 치면 내용은 그대로지만 시각이 바뀐다. 여기에 딸린 부작용이 크다. find -mtime 기반 정리 스크립트가 그 파일을 "새 파일"로 판단해 건너뛰고, rsync는 변경된 것으로 보고 다시 전송하며, make는 불필요한 재빌드를 한다. 존재 여부만 확인할 생각이었다면 ls나 test -e를 쓴다.
touch는 파일을 비우지 않는다. 로그를 초기화하려고 touch app.log를 쳐 봐야 크기는 그대로다. 서비스가 열고 있는 로그를 비울 때는 아이노드를 유지하는 truncate 방식을 쓴다.
: > /var/log/myapp/app.log # 셸 리다이렉션으로 0바이트
truncate -s 0 /var/log/myapp/app.log
같은 상황에서 rm 후 touch를 하면 프로세스는 지워진 옛 아이노드에 계속 쓰기 때문에 새 파일은 계속 0바이트로 남는다.
상위 디렉토리는 만들어 주지 않는다. touch /var/log/myapp/app.log는 /var/log/myapp가 없으면 No such file or directory로 실패한다. mkdir -p를 먼저 친다.
권한 규칙이 두 단계다. 시각을 현재 시각으로 갱신하려면 파일에 대한 쓰기 권한이면 되지만, -t·-d로 임의 시각을 지정하려면 파일 소유자이거나 root여야 한다. 남의 파일에 touch -d가 Operation not permitted로 실패하는 이유가 이것이다.
-d의 상대 시각 표현은 GNU 전용이다. '40 days ago' 같은 형식은 GNU coreutils에서만 통한다. macOS·BSD에서는 -t의 고정 형식이나 -A(상대 조정)를 써야 하므로, 리눅스 서버에서 쓰던 스크립트를 맥에서 그대로 돌리면 실패한다.
함께 보면 좋은 명령어
- stat — atime·mtime·ctime을 초 단위로 확인한다.
touch결과를 검증할 때 함께 쓴다. - truncate — 파일 크기를 조정한다. 로그 비우기는
touch가 아니라 이쪽이다. - flock — 중복 실행 방지가 목적이라면 플래그 파일보다 안전한 잠금을 제공한다.