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

컴퓨터 파일엔 메타 데이터(Meta Data)가 존재합니다. 메타 데이터는 간략하게 어떠한 목적을 가지고 만들어진 데이터로써 데이터에 대한 데이터로 명명합니다.

대량의 정보 가운데에서 찾고 있는 정보를 효율적으로 찾아내서 이용하기 위해 일정한 규칙에 따라 콘텐츠에 대하여 부여되는 데이터 – 위키피디아

가령, 웹페이지에는 메타 태그라 하여 title이나 description, keyword 등을 부여해 검색 엔진으로 하여금 검색 키워드에 맞는 데이터를 효율적으로 찾도록 도와줍니다. 또한, 사진 파일 같은 경우, 위치 정보, 노출 시간, 해상도, 파일 타입 등을 담아 사용자들로 하여금 편리하게 사진 파일을 관리할 수 있게 도와줍니다.

맥에는 Spotlight라는 기능이 존재하는데 이 Spotlight의 핵심이 바로 mdls, mdfind command입니다. 파일 안에 들어 있는 메타 데이터를 검색해 빠른 시간 안에 유저가 원하는 파일으로 접근 가능하게 해주니깐 말이죠.

터미널 상에서 파일을 탐색하는데 사용되는 커맨드는 주로 ls, find, locate 등이 있는데, 이들 모두 보여지는 파일 이름이 색인 대상이 되고 내용을 검색해주진 않습니다. 하지만, mdls, mdfind command를 이용하면, 파일 안에 저장되어 있는 메타 데이터를 통해 더욱 더 효율적인 파일 탐색을 할 수 있습니다.


mdls로 메타 데이터 보기

파일 안에 저장되어 있는 메타 데이터를 보여주는 커맨드입니다. 문법은 간단합니다.

$mdls 파일이름

사진 파일을 간단히 돌려보면 아래와 같이 수십개의 저장되어 있는 메타 데이터가 표시되게 됩니다. 그 중 아래와 같은 정보들은 평소에도 자주 이용하는 데이터들입니다. 이러한 데이터들은 보는 것만으로도 유용하지만, 검색에 적극적으로 활용될 수 있습니다. 아래 mdfind 단락에서 설명되어 있습니다.

  • 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 //해상도 가로
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
~/Test (548) $mdls example.JPG
_kMDItemOwnerUserID            = 501
kMDItemAcquisitionMake         = “Apple”
kMDItemAcquisitionModel        = “iPhone 7 Plus”
kMDItemAltitude                = 110.6668092386655
kMDItemAperture                = 1.695993715632365
kMDItemBitsPerSample           = 32
kMDItemColorSpace              = “RGB”
kMDItemContentCreationDate     = 20170903 09:03:21 +0000
kMDItemContentModificationDate = 20170903 09:03:21 +0000
kMDItemContentType             = “public.jpeg”
kMDItemContentTypeTree         = (
“public.jpeg”,
“public.item”,
“public.data”,
“public.image”,
“public.jpeg”,
“public.content”
)
kMDItemCreator                 = “10.3.3”
kMDItemDateAdded               = 20170919 03:30:50 +0000
kMDItemDisplayName             = “example.JPG”
kMDItemEXIFVersion             = “2.2.1”
kMDItemExposureMode            = 0
kMDItemExposureProgram         = 2
kMDItemExposureTimeSeconds     = 0.04166666666666666
kMDItemFlashOnOff              = 0
kMDItemFNumber                 = 1.8
kMDItemFocalLength             = 3.99
kMDItemFSContentChangeDate     = 20170903 09:03:21 +0000
kMDItemFSCreationDate          = 20170903 09:03:21 +0000
kMDItemFSCreatorCode           = “”
kMDItemFSFinderFlags           = 0
kMDItemFSHasCustomIcon         = (null)
kMDItemFSInvisible             = 0
kMDItemFSIsExtensionHidden     = 0
kMDItemFSIsStationery          = (null)
kMDItemFSLabel                 = 0
kMDItemFSName                  = “example.JPG”
kMDItemFSNodeCount             = (null)
kMDItemFSOwnerGroupID          = 20
kMDItemFSOwnerUserID           = 501
kMDItemFSSize                  = 2312911
kMDItemFSTypeCode              = “”
kMDItemGPSDateStamp            = “2017:09:03”
kMDItemGPSDestBearing          = 209.9710467706013
kMDItemHasAlphaChannel         = 0
kMDItemImageDirection          = 209.9710467706013
kMDItemISOSpeed                = 40
kMDItemKind                    = “JPEG image”
kMDItemLatitude                = 35.15819166666667
kMDItemLogicalSize             = 2312911
kMDItemLongitude               = 129.1823883333333
kMDItemOrientation             = 0
kMDItemPhysicalSize            = 2314240
kMDItemPixelCount              = 12192768
kMDItemPixelHeight             = 3024
kMDItemPixelWidth              = 4032
kMDItemProfileName             = “Display P3”
kMDItemRedEyeOnOff             = 0
kMDItemResolutionHeightDPI     = 72
kMDItemResolutionWidthDPI      = 72
kMDItemSpeed                   = 0
kMDItemTimestamp               = “09:03:20”
kMDItemWhiteBalance            = 0
cs

 

하지만, 매번 위와 같은 많은 양의 데이터를 다 보고 싶지 않을 수 있습니다. 이때, grep command를 이용하여, 좀 더 필요한 데이터만 뽑아 올 수 있습니다. 예를 들어 아래 커맨드를 돌리게 되면,

$mdls example.JPG | grep -E '(Model|Make)'

Make와 Model의 패턴이 들어 있는 Line들만 나오게 됩니다.

1
2
3
~/Test (550) $mdls example.JPG | grep ‘(Model|Make)’
kMDItemAcquisitionMake         = “Apple”
kMDItemAcquisitionModel        = “iPhone 7 Plus”
cs

 

사진 관련 데이터에 주로 보고 싶은 데이터 항목들이 있다면 alias로 만들어 ~/.bash_profile에 등록해두면 편하게 사용이 가능합니다.

$vi ~/.bash_profile

위 커맨드를 실행한 후, 아래 커맨드를 추가해준다면,

alias grepphoto="grep -E '(PixelHeight|PixelWidth|ExposureTime|Model|Make|DPI|Latitude|Longitude|DisplayName|CreationDate|ModificationDate|ContentType|DisplayName)'"

아래 커맨드만 실행하는 것으로 주로 보는 항목들만 편하게 볼 수 있습니다.

초록색은 command prompt에서 입력할 명령어이고, 뒤에 주황색은 본인이 원하는 항목들을 |로 끊어 명시해주시면 됩니다.

$mdls example.JPG | grepphoto
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
~/Test (551) $mdls example.JPG | grepphoto
kMDItemAcquisitionMake         = “Apple”
kMDItemAcquisitionModel        = “iPhone 7 Plus”
kMDItemContentCreationDate     = 20170903 09:03:21 +0000
kMDItemContentModificationDate = 20170903 09:03:21 +0000
kMDItemContentType             = “public.jpeg”
kMDItemContentTypeTree         = (
kMDItemDisplayName             = “example.JPG”
kMDItemExposureTimeSeconds     = 0.04166666666666666
kMDItemFSCreationDate          = 20170903 09:03:21 +0000
kMDItemLatitude                = 35.15819166666667
kMDItemLongitude               = 129.1823883333333
kMDItemPixelHeight             = 3024
kMDItemPixelWidth              = 4032
kMDItemResolutionHeightDPI     = 72
kMDItemResolutionWidthDPI      = 72
cs

 

위와 같이 사진 파일 뿐만 아니라 사용자가 자주 사용하는 파일의 메타 데이터를 표시를 위와 같이 정리해서 사용하면 편리합니다.


mdfind로 메타 데이터를 이용한 검색하기

mdfind는 위에 mdls로 검색할 시 나오는 수십개의 항목들(kMDItem…. 등등)을 이용하여 검색할 수 있는 커맨드입니다.

/부터 검색을 하고자 한다면, 아래와 같이하시면 되고

$mdfind "kMDItemAcquisitionMake == 'Apple'"

특정 검색 부분을 지정하시고자 하시면, -onlyin 경로 로 명시해 주시면 됩니다.

$mdfind -onlyin ~/Pictures "kMDItemAcquisitionMake == 'Apple'"

파일 전체 경로가 나타나 보기 불편하다면, 좀 더 advanced하게 이용 가능합니다. ~/Pictures 폴더 안에 SONY제조사를 가지고 있는 파일들을 mdls로 메타 데이터를 출력하고, grep을 통해 파일이름(DisplayName)만 출력하는 것입니다.

$mdfind -0 -onlyin ~/Pictures "kMDItemAcquisitionMake == 'SONY'" | xargs -0 mdls | grep -E '(DisplayName)'"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
~/Test (561) $mdfind 0 onlyin ~/Pictures “kMDItemAcquisitionMake == ‘SONY'” | xargs 0 mdls | grep ‘(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”
cs

 

날짜를 이용한 검색도 가능합니다.

일주일 이전부터 생성된 파일들을 보고 싶다면, (-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)'

등이 있습니다.


참고

댓글 남기기