파일의 숨겨진 흔적(메타데이터) 지우기(MACOS)

맥에서 인터넷에서 받은 PDF의 다운로드 주소를 깔끔하게 지우고 보관하자.

인터넷에서 받은 PDF 파일 등에 남은 다운로드 주소 와 작성자 정보 를 깔끔하게 지우는 방법입니다.

1 메타데이터(파일의 이름표)는 왜 두 종류일까?

  1. 파일에는 눈에 보이는 내용 말고도 메타데이터(파일의 숨겨진 신상정보) 가 들어 있습니다.
  2. 이 정보는 크게 겉면 스티커(확장 속성) 와 내용물 도장(내부 메타데이터) 두 가지로 나뉩니다.
  3. 두 정보는 적혀 있는 위치가 다르기 때문에, 각각 다른 전용 지우개(명령어 도구) 를 사용해야 완벽히 지워집니다.

2 겉면 스티커 떼기: xattr

  1. 인터넷에서 파일을 받으면 맥북이 파일 겉면에 확장 속성(택배 운송장 스티커 같은 추가 정보) 으로 다운로드 주소를 적어둡니다.
  2. xattr 은 이 겉면 스티커만 골라서 떼어내는 맥북의 기본 CLI 도구(마우스 대신 글자로 명령을 내리는 프로그램) 입니다.
  3. 질문하셨던 명령어는 아주 정확하며, 뒤에 에러 무시 옵션(스티커가 없어도 조용히 넘어가게 하는 설정) 만 붙이면 완벽합니다.
명령어 조각쉬운 뜻풀이
xattr -d확장 속성(겉면 스티커)을 삭제(Delete) 해라!
com.apple.metadata:kMDItemWhereFroms스티커 이름: '어디서 다운로드했는지 적힌 인터넷 주소(URL)'
com.apple.quarantine스티커 이름: '외부 인터넷에서 가져왔다는 경고 딱지(격리 속성)'
"$1"내가 첫 번째로 선택한 파일(변수) 에 실행해라!
2>/dev/null만약 떼어낼 스티커가 없더라도 에러 메시지를 띄우지 말고 쓰레기통(null)에 버려라!

3 파일 속 내용물 도장 지우기: exiftool

  1. 상자 겉면의 스티커( xattr )를 떼어내도, PDF 파일 내부 메타데이터(문서 안쪽에 찍힌 만든 사람 이름이나 프로그램 도장) 는 그대로 남아 있습니다.
  2. exiftool 은 아이콘을 눌러 여는 일반 앱이 아니라, 터미널(명령어 입력창)에서 글자로 작동하는 파일 내부 청소 전용 도구 입니다.
  3. 홈브루(Homebrew, 맥북용 프로그램 설치 자판기) 로 한 번만 설치해 두면, 기존 자동화 스크립트에 한 줄만 추가해서 같이 쓸 수 있습니다.
명령어 조각쉬운 뜻풀이
brew install exiftool[최초 1회 설치] 프로그램 자판기(brew)에서 exiftool을 설치 해라!
-all:all=파일 안쪽에 적힌 모든 내부 정보(작성자, 제목 등)를 빈칸(=)으로 지워라!
-overwrite_original복사본(백업 파일)을 따로 남기지 말고 원본 파일에 바로 덮어써라!

4 한 번에 끝내는 최종 스크립트 (맥 오토메이터이용 )

  1. 맥 오토메이터를 이용하여 만들자. 중요한 포인트는 만들고 -> 보안에서 전체권한설정을 해야한다.
export PATH="/opt/homebrew/bin:/usr/local/bin:$PATH"
LOG="$HOME/Downloads/meta_clean.log"
echo "=== $(date) ===" > "$LOG"
left=0

clean_one() {
    local p="$1" ro=0 mode=""

    # 잠김(uchg) 해제, 읽기 전용이면 잠시 쓰기 권한 부여
    chflags nouchg "$p" 2>>"$LOG"
    if [ ! -w "$p" ]; then
        ro=1; mode=$(stat -f %Lp "$p"); chmod u+w "$p"
    fi

    # 1. 내부 메타데이터 (회전 정보 유지). 지원 안 하는 형식은 로그에만 남고 넘어감
    exiftool -all= -tagsfromfile @ -Orientation -overwrite_original "$p" >>"$LOG" 2>&1

    # 2. PDF는 qpdf로 재작성 (설치된 경우만)
    if [[ "$p" == *.[pP][dD][fF] ]] && command -v qpdf >/dev/null 2>&1; then
        qpdf --linearize --replace-input "$p" >>"$LOG" 2>&1
    fi

    # 3. 확장 속성은 반드시 마지막에
    xattr -c "$p" >>"$LOG" 2>&1

    # 권한 원복
    [ "$ro" -eq 1 ] && chmod "$mode" "$p"

    # 4. 검증: WhereFroms가 남았는지
    if xattr "$p" 2>/dev/null | grep -q kMDItemWhereFroms; then
        echo "WhereFroms 남음: $p" >>"$LOG"
        left=$((left+1))
    fi

    # Finder '정보 가져오기'의 '어디서' 갱신용 Spotlight 재색인
    mdimport "$p" >/dev/null 2>&1
}

for f in "$@"; do
    # 파일이든 폴더든 안쪽 파일 전부 처리
    while IFS= read -r -d '' p; do
        clean_one "$p"
    done < <(find "$f" -type f -print0)
done

if [ "$left" -eq 0 ]; then
    osascript -e 'display notification "파일 청소가 완료되었습니다." with title "메타데이터 청소"'
else
    osascript -e "display notification \"WhereFroms 남은 파일 $left 개. 데스크탑 meta_clean.log 확인\" with title \"메타데이터 청소\""
fi

5 Hazel 에서 세팅

필자의 경우 pdf, html, epub 3가지를 조건을 걸었다.

export PATH="/opt/homebrew/bin:/usr/local/bin:$PATH"
f="$1"

# 0. 브라우저가 다운로드 마무리(출처·격리 속성 기록)를 끝낼 때까지 대기
sleep 10

# 1. 내부 메타데이터: PDF만
case "$f" in
  *.[pP][dD][fF])
    exiftool -all:all= -overwrite_original "$f" >/dev/null 2>&1
    command -v qpdf >/dev/null 2>&1 && qpdf --linearize --replace-input "$f" >/dev/null 2>&1
    ;;
esac

# 2. 다운로드 흔적 속성 삭제 (태그 등은 유지)
for a in com.apple.metadata:kMDItemWhereFroms \
         com.apple.metadata:kMDItemDownloadedDate \
         com.apple.quarantine; do
  xattr -d "$a" "$f" 2>/dev/null
done

# 3. Spotlight 색인 갱신 (정보 창 '출처' 반영)
mdimport "$f" >/dev/null 2>&1

# 4. 검증: 남아 있으면 실패 처리 → 알림 안 뜨고 Hazel 로그에 기록
if xattr "$f" 2>/dev/null | grep -q kMDItemWhereFroms; then
  echo "WhereFroms 남음: $f" >&2
  exit 1
fi
exit 0
▲