[맥 터미널 / Unix ] mdls, mdfind 메타데이터 검색하기

맥의 터미널(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)'

이상입니다.

참고

참조

댓글 남기기