Mac 파일 속성 추출 속도 3배 개선: xattr vs mdls vs stat 실전 비교


Mac에서 파일 메타데이터를 가져올 때 xattr: command not found 에러나 Spotlight 인덱싱 문제로 고생하신 적 있나요? 이 글에서는 파일 속성을 추출하는 3가지 방법의 성능을 직접 측정하고, 각 방법의 숨겨진 기능들을 실험해봤어요.


실험 결과 미리보기: xattr이 mdls보다 평균 3.2배 빠르지만, 특정 상황에서는 mdls가 더 유용한 정보를 제공해요. 1000개 파일 테스트에서 xattr은 0.8초, mdls는 2.6초가 걸렸네요.


문제: Mac 파일의 숨겨진 속성들을 어떻게 확인할까?


Mac은 파일에 엄청나게 많은 메타데이터를 저장해요. 다운로드 출처, 색상 태그, Spotlight 인덱스 정보, 심지어 파일을 언제 열었는지까지 기록되죠. 하지만 이 정보들을 효율적으로 추출하는 방법은 잘 알려지지 않았어요.


세 가지 방법 성능 실측 (macOS Sonoma 14.5)


테스트 환경 설정

# 테스트용 파일 1000개 생성
for i in {1..1000}; do
    touch "test_file_$i.txt"
    echo "Content $i" > "test_file_$i.txt"
    # 랜덤 xattr 추가
    xattr -w com.apple.metadata:test "value_$i" "test_file_$i.txt"
done


1. xattr 명령어 (가장 빠름)

# 성능 측정
time for file in test_file_*.txt; do
    xattr -l "$file" > /dev/null
done
# 결과: 0.812초

# 실제 사용 예제
xattr -l ~/Downloads/image.png


xattr 주요 속성들:

  • com.apple.quarantine: 다운로드 출처와 날짜
  • com.apple.FinderInfo: Finder 태그와 색상
  • com.apple.lastuseddate#PS: 마지막 사용 시간
  • com.apple.metadata:kMDItemWhereFroms: 다운로드 URL

2. mdls (Spotlight 메타데이터)

# 성능 측정
time for file in test_file_*.txt; do
    mdls "$file" > /dev/null
done
# 결과: 2.634초

# 실제 사용 예제
mdls -name kMDItemContentType -name kMDItemFSSize ~/Documents/report.pdf


mdls만 제공하는 정보:

  • kMDItemPixelHeight/Width: 이미지 크기
  • kMDItemDurationSeconds: 비디오 길이
  • kMDItemNumberOfPages: PDF 페이지 수
  • kMDItemTextContent: 파일 내용 검색

3. stat 명령어 (기본 속성)

# 성능 측정
time for file in test_file_*.txt; do
    stat -f "%Sm %z %p" "$file" > /dev/null
done
# 결과: 0.523초

# 실제 사용 예제
stat -f "Size: %z bytes, Modified: %Sm" -t "%Y-%m-%d %H:%M" file.txt


의외의 발견: 숨겨진 메타데이터 활용법


1. 다운로드 파일 보안 체크

# quarantine 속성으로 신뢰할 수 없는 파일 찾기
find ~/Downloads -xattrname com.apple.quarantine -print0 | while IFS= read -r -d '' file; do
    echo "경고: $file"
    xattr -p com.apple.quarantine "$file" | xxd -r -p | plutil -p -
done


2. Spotlight 인덱싱 문제 해결

# 인덱싱 상태 확인
mdls -name kMDItemFSContentChangeDate -name kMDItemDateAdded file.txt

# 인덱싱 강제 갱신
mdimport -i /path/to/file

# 특정 폴더 제외
touch .metadata_never_index


3. 커스텀 메타데이터 활용

# 프로젝트 버전 관리
xattr -w com.mycompany.version "2.1.0" project.zip
xattr -w com.mycompany.build_date "$(date)" project.zip

# 나중에 검색
mdfind "kMDItemFSName == '*.zip'" | while read file; do
    version=$(xattr -p com.mycompany.version "$file" 2>/dev/null)
    [[ -n "$version" ]] && echo "$file: v$version"
done


실전 스크립트: 파일 메타데이터 종합 리포트


#!/bin/bash
# file_metadata_report.sh

analyze_file() {
    local file="$1"
    echo "=== $file ==="
    
    # 기본 정보 (stat)
    echo "기본 정보:"
    stat -f "  크기: %z bytes
  수정: %Sm
  권한: %Sp" -t "%Y-%m-%d %H:%M" "$file"
    
    # Extended Attributes
    echo "확장 속성:"
    xattr -l "$file" 2>/dev/null | sed 's/^/  /'
    
    # Spotlight 메타데이터 (주요 항목만)
    echo "Spotlight 정보:"
    mdls -name kMDItemKind \
         -name kMDItemContentType \
         -name kMDItemWhereFroms "$file" 2>/dev/null | 
         grep -v "(null)" | sed 's/^/  /'
}

# 성능 측정 모드
if [[ "$1" == "--benchmark" ]]; then
    echo "벤치마크 시작..."
    
    start=$(date +%s%N)
    find . -type f -exec xattr -l {} \; > /dev/null 2>&1
    end=$(date +%s%N)
    echo "xattr: $((($end-$start)/1000000))ms"
    
    start=$(date +%s%N)
    find . -type f -exec mdls {} \; > /dev/null 2>&1
    end=$(date +%s%N)
    echo "mdls: $((($end-$start)/1000000))ms"
else
    analyze_file "$1"
fi


성능 최적화 팁


1. 대량 파일 처리시

# 느림 (프로세스 반복 생성)
for file in *.txt; do
    xattr -l "$file"
done

# 빠름 (xargs 병렬 처리)
find . -name "*.txt" -print0 | xargs -0 -P 8 -I {} xattr -l {}


2. 특정 속성만 필요할 때

# 전체 속성 (느림)
mdls file.pdf | grep Width

# 특정 속성만 (빠름)
mdls -name kMDItemPixelWidth file.pdf


주의사항과 트러블슈팅


xattr 권한 문제

# SIP(System Integrity Protection) 관련 에러시
# /System 폴더는 접근 불가
xattr /System/Library/CoreServices/Finder.app
# Operation not permitted 에러 발생

# 해결: 사용자 파일만 대상으로
xattr ~/Documents/*


Spotlight 인덱싱 제외 파일

# .noindex 파일이 있는 폴더는 mdls 결과 제한적
touch ~/private_folder/.noindex

# 확인 방법
mdutil -s /path/to/folder


iCloud Drive 파일 처리

# 다운로드되지 않은 파일 체크
if [[ -z $(xattr -p com.apple.icloud.is-downloaded "$file" 2>/dev/null) ]]; then
    echo "파일이 로컬에 없음. 다운로드 필요"
    brctl download "$file"
fi


실험 결론

  • xattr: 단순 속성 확인에 최적. 특히 보안 관련 체크나 커스텀 메타데이터 작업시 필수예요.
  • mdls: 콘텐츠 기반 검색이나 미디어 파일 정보가 필요할 때 유용해요. 속도는 느리지만 정보량이 풍부하죠.
  • stat: 기본 파일 시스템 정보만 필요하면 가장 빨라요.


실제 프로젝트에서는 용도에 따라 조합해서 사용하는 게 좋아요. 파일 보안 체크는 xattr로, 미디어 정보는 mdls로, 기본 정보는 stat으로 처리하면 최적의 성능을 낼 수 있어요.


프로덕션 적용시 주의: macOS 버전별로 속성 이름이 다를 수 있으니 꼭 테스트 후 적용하세요. 특히 Big Sur 이후 버전에서는 일부 메타데이터 구조가 변경됐어요.


Mac Finder 태그 1만개 파일 3초만에 분석하기: Python vs Swift vs Shell 성능 실험