맥의 터미널(Unix) 환경에서 메타데이터를 검색하는 방법에 관한 글입니다. 파일에 존재하는 메타데이터는 어떠한 목적을 가지고 만들어진 데이터로써 데이터에 대한 데이터로 생각하시면 됩니다.
- 웹페이지의 메타 태그 : title, description, keyword 등을 담고 있어 검색 엔진이 검색 키워드에 맞는 웹페이지를 효율적으로 찾도록 도와줍니다.
- 사진 파일의 메타데이터 : 위치 정보, 노출 시간, 해상도, 파일 타입 등을 담아 사용자이 편리하게 사진 파일을 관리할 수 있게 도와줍니다.
사진에 있는 메타데이터 예시 ▼
메타데이터 사용 예시 | 스팟라이트 ▼
맥에는 ‘스팟라이트’라는 메타데이터 검색 기능이 존재하는데 파일의 메타데이터를 해석하여 사용자가 원하는 항목을 빠르게 색인해줍니다. 활성 상태 보기(Activity Monitor)로 확인해보시면 ‘mdworker’라는 프로세스가 지속적으로 메타데이터를 수집하고 있음을 알 수 있습니다.
메타데이터 확인하기 | mdls
mdls는 해당 파일의 메타데이터 정보를 리스팅해주는 커맨드입니다. 흔히 사용되는 ls 커맨드에 md(metadate)가 붙여졌다고 생각하면 됩니다.
* 터미널 환경에서 파일을 탐색하는데 사용되는 커맨드는 주로 ls, find, locate 등이 있지만, 파일 이름이 색인 대상이라 메타데이터를 검색하진 않습니다.
기본 문법 ▼
mdls [파일 이름]
사진 파일 예시 ▼
mdls로 사진 파일을 간단히 돌려보면 수십개의 저장된 메타데이터가 표시되게 됩니다. 그 중 아래와 같은 정보들은 평소에도 자주 이용하는 데이터들입니다. 이러한 데이터들은 보는 것만으로도 유용하지만, 검색에 적극적으로 활용될 수 있습니다(mdfind 단락에서 설명되어 있습니다).
$ mdls example.jpg kMDItemAcquisitionMake = "Apple" //제조사 kMDItemAcquisitionModel = "iPhone 7 Plus" //모델 kMDItemContentCreationDate = 2017-09-03 09:03:21 +0000 //생성 시간 kMDItemContentModificationDate = 2017-09-03 09:03:21 +0000 //수정 시간 kMDItemContentType = "public.jpeg" //타입 kMDItemDisplayName = "example.JPG" //파일 이름 kMDItemExposureTimeSeconds = 0.04166666666666666 //노출 시간 kMDItemLatitude = 35.15819166666667 //위치 정보 위도 kMDItemLongitude = 129.1823883333333 //위치 정보 경도 kMDItemPixelHeight = 3024 //픽셀 세로 kMDItemPixelWidth = 4032 //픽셀 가로 kMDItemResolutionHeightDPI = 72 //해상도 세로 kMDItemResolutionWidthDPI = 72 //해상도 가로
| grep로 색인 범위 한정 ▼
매번 많은 양의 데이터(위)를 다 확인할 필요는 없습니다. 이때, ‘| grep’을 활용하시면 좀 더 필요한 데이터에 집중하실 수 있습니다.
입력
$ mdls example.JPG | grep -E '(Model|Make)'
출력 | Make와 Model의 패턴이 들어 있는 라인만 출력됩니다.
~/Test (550) $mdls example.JPG | grep -E '(Model|Make)' kMDItemAcquisitionMake = "Apple" kMDItemAcquisitionModel = "iPhone 7 Plus"
사진 파일 관련 mdls & grep 조합 ▼
사진 파일에서 유용한 메타데이터를 정리해서 grep과 엮어두었습니다.
grep -E '(PixelHeight|PixelWidth|ExposureTime|Model|Make|DPI|Latitude|Longitude|DisplayName|CreationDate|ModificationDate|ContentType|DisplayName)'
쉘 환경설정(~/.bash_profile 혹은 /bashrc)에서 alias로 등록해두시면 편하게 사용하실 수 있습니다.
alias grepphoto="grep -E '(PixelHeight|PixelWidth|ExposureTime|Model|Make|DPI|Latitude|Longitude|DisplayName|CreationDate|ModificationDate|ContentType|DisplayName)'"
alias가 등록되어 있을 때 ‘| grepphoto’로만 필요한 메타데이터 집합을 부를 수 있습니다.
$ mdls example.JPG | grepphoto kMDItemAcquisitionMake = "Apple" kMDItemAcquisitionModel = "iPhone 7 Plus" kMDItemContentCreationDate = 2017-09-03 09:03:21 +0000 kMDItemContentModificationDate = 2017-09-03 09:03:21 +0000 kMDItemContentType = "public.jpeg" kMDItemContentTypeTree = ( kMDItemDisplayName = "example.JPG" kMDItemExposureTimeSeconds = 0.04166666666666666 kMDItemFSCreationDate = 2017-09-03 09:03:21 +0000 kMDItemLatitude = 35.15819166666667 kMDItemLongitude = 129.1823883333333 kMDItemPixelHeight = 3024 kMDItemPixelWidth = 4032 kMDItemResolutionHeightDPI = 72 kMDItemResolutionWidthDPI = 72
* 사진 파일 뿐만 아니라 자주 사용하는 파일의 메타데이터 항목을 위와 같이 정리해서 사용하면 편리합니다.
메타데이터를 이용한 검색 | mdfind
mdfind는 위에 mdls로 나오는 수십 개의 항목들(kMDItem…. 등등)을 이용하여 검색할 수 있는 커맨드입니다. 사진 파일에 있는 메타데이터를 이용한 몇가지 예시를 기록해두었으니 참고하시기 바랍니다.
기본 문법 ▼
mdfind [메타데이터 값]
/(루트)부터 검색 | 제조사가 ‘Apple’ 검색 ▼
/(루트)부터 검색을 하고자 한다면 굳이 경로를 명시할 필요 없습니다.
$ mdfind "kMDItemAcquisitionMake == 'Apple'"
특정 경로에서만 검색 | ~/Pictures 디렉토리에서 검색 ▼
특정 디렉토리에서 검색하고자 하시면 ‘-onlyin 경로’로 명시해주시면 됩니다.
$ mdfind -onlyin ~/Pictures "kMDItemAcquisitionMake == 'Apple'"
검색 결과에서 파일 경로 제거 ▼
| xargs -0 mdls | grep -E '(DisplayName)'"
- ~/Pictures 디렉토리 안에 SONY 제조사를 가지고 있는 파일 리스트를 mdls로 출력한 후, ‘| grep’을 통해 파일이름(DisplayName)만 출력
$ mdfind -0 -onlyin ~/Pictures "kMDItemAcquisitionMake == 'SONY'" | xargs -0 mdls | grep -E '(DisplayName)' kMDItemDisplayName = "DSC04009.ARW" kMDItemDisplayName = "Guam_290.jpg" kMDItemDisplayName = "Guam_2.png" kMDItemDisplayName = "Guam_19.jpg" kMDItemDisplayName = "DSC04041.ARW" kMDItemDisplayName = "DSC04040.ARW" kMDItemDisplayName = "DSC04039.ARW" kMDItemDisplayName = "DSC04038.ARW" kMDItemDisplayName = "DSC04037.ARW" kMDItemDisplayName = "DSC04036.ARW" kMDItemDisplayName = "DSC04035.ARW" kMDItemDisplayName = "DSC04034.ARW" kMDItemDisplayName = "DSC04033.ARW" kMDItemDisplayName = "DSC04032.ARW"
날짜를 이용한 검색 ▼
- 일주일 이전부터 생성된 파일 (-1 : 1주일, -2 : 2주일 등)
$mdfind -onlyin ~/Pictures 'kMDItemContentCreationDate > $time.this_week(-1)'
- 한시간 전부터 생성된 파일 (3600초)
$mdfind -onlyin ~/Pictures 'kMDItemContentCreationDate > $time.now(-3600)'
- 2017-09-03 이후에 생성된 파일
$mdfind -onlyin ~/Pictures 'kMDItemContentCreationDate > $time.iso(2017-09-03)'
이상입니다.
참고
- 맥 스팟라이트 100프로 활용하기
- [맥 터미널 / Unix] grep 커맨드로 파일 내부의 패턴 찾기
- [맥 터미널 / Unix] find 커맨드로 파일 검색하기
- [맥 터미널 / Unix] locate 커맨드로 초간단 파일 찾기
- 맥 사진 앱에서 사진을 복사할 때 메타 데이터(GPS 등) 관련 주의할 점
- 맥에서 EXIF 사진 정보 보는 법
참조