우분투 실전 명령어 | 파일 검색/치환(find, xargs, sed) 안전 사용법

언제 쓰는가

로그 디렉터리에서 특정 패턴 파일만 골라 한 번에 처리해야 할 때 씁니다. 예를 들어 오래된 임시 파일 정리, 설정 파일 일괄 치환, 특정 확장자만 권한 변경 같은 작업입니다. 이때 find + xargs + sed를 섞어 쓰면 빠르지만, 공백 파일명이나 과한 치환 때문에 사고가 자주 납니다.

바로 쓰는 명령어

# 1) /var/log 아래에서 7일 초과 .log 파일 찾기
find /var/log -type f -name "*.log" -mtime +7

# 2) 공백/특수문자 파일명까지 안전하게 삭제
find /tmp -type f -name "*.tmp" -print0 | xargs -0 -I{} echo rm -f "{}"

# 점검 후 실제 실행
find /tmp -type f -name "*.tmp" -print0 | xargs -0 rm -f

# 3) 설정 파일에서 포트 값 치환
sed -i.bak -E 's/^PORT=.*/PORT=8081/' /etc/myapp/app.env

# 4) 디렉터리 전체에서 문자열 치환
find ./config -type f -name "*.conf" -print0 \
  | xargs -0 sed -i.bak 's/old.internal/new.internal/g'

핵심 옵션/패턴

  • find -type f -name "패턴": 파일만 대상으로 제한합니다.
  • -mtime +7: 7일보다 오래된 파일입니다.
  • -print0 + xargs -0: 파일명에 공백, 괄호, 한글이 있어도 안전합니다.
  • sed -i.bak: 원본 백업을 남기고 치환합니다. 운영 서버에서는 거의 필수입니다.
  • sed -E: 확장 정규식 사용 시 가독성이 좋아집니다.

자주 하는 실수

  • xargs-0 없이 써서 공백 파일명이 쪼개지는 문제.
  • sed -i를 백업 없이 바로 실행해 복구 포인트가 없는 문제.
  • find /처럼 범위를 너무 크게 잡아 성능 저하를 만드는 문제.
  • 테스트 없이 삭제/치환을 바로 실행하는 문제(echo, head로 미리 확인 필요).

검증 방법

# 삭제 대상 개수 사전 확인
find /tmp -type f -name "*.tmp" | wc -l

# 치환 전후 diff 확인
cp /etc/myapp/app.env /tmp/app.env.before
sed -i.bak -E 's/^PORT=.*/PORT=8081/' /etc/myapp/app.env
diff -u /tmp/app.env.before /etc/myapp/app.env

# 백업 파일 존재 확인
ls -l /etc/myapp/app.env.bak

실행 결과 예시

$ find /tmp/demo -type f -name "*.tmp" -print0 | xargs -0 -I{} echo rm -f "{}"
rm -f /tmp/demo/a.tmp
rm -f /tmp/demo/cache old.tmp
rm -f /tmp/demo/(stale).tmp

$ sed -i.bak -E 's/^PORT=.*/PORT=8081/' /tmp/app.env
$ grep '^PORT=' /tmp/app.env
PORT=8081
$ ls -1 /tmp/app.env*
/tmp/app.env
/tmp/app.env.bak

출처

  • GNU Findutils Manual
  • GNU sed Manual
  • Ubuntu Manpages