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 이후 버전에서는 일부 메타데이터 구조가 변경됐어요.