본문 바로가기

OS/Mac OS X

파일이름에 생성시간 붙이기

파일이 파일시스템을 넘나들면서 메타데이터를 잃어버리는 일이 종종 있다.


사진 이미지나 음성 녹음 파일과 같은 경우에는만들어진 시간이 중요한 정보일 수 있다.

그래서 파일이름 자체에 파일 시간을 넣어두면 유용할 수 있다.


1. 파일 생성 시간 가져오기

mac 에서는 파일 만들어진 시간을 가져오기 위해 mdls라는 명령을 이용할 수 있다.

이 명령은 BSD General Commands 이기 때문에 BSD 시스템에서 가능하다.


우선 터미널에서 달랑 명령을 쓰게 되면 아래와 같이 파일 이름이 주어지지 않았다고 나온다.

➜  ~ mdls

(null): no filename specified!


usage: mdls [-name attr] [-raw [-nullMarker markerString]] [-plist file] path

list the values of one or all the attributes of the specified file

  -raw:         don't print attribute names before values

  -nullMarker:  substitute this string for null attributes in raw mode

  -plist:       output attributes in XML format to file. Use - to write to stdout

                option -plist is incompatible with options -raw, -nullMarker, and -name

example:  mdls  ~/Pictures/Birthday.jpg

example:  mdls  -name Keyword ~/Pictures/Birthday.jpg


touch 명령으로 파일을 만들어서 수행해보았다.

➜  ~ touch test.txt

➜  ~ mdls test.txt

_kMDItemOwnerUserID            = 501

kMDItemContentCreationDate     = 2017-05-02 02:01:06 +0000

kMDItemContentModificationDate = 2017-05-02 02:01:06 +0000

kMDItemContentType             = "public.plain-text"

kMDItemContentTypeTree         = (

    "public.plain-text",

    "public.text",

    "public.data",

    "public.item",

    "public.content"

)

kMDItemDateAdded               = 2017-05-02 02:01:06 +0000

kMDItemDisplayName             = "test.txt"

kMDItemFSContentChangeDate     = 2017-05-02 02:01:06 +0000

kMDItemFSCreationDate          = 2017-05-02 02:01:06 +0000

kMDItemFSCreatorCode           = ""

kMDItemFSFinderFlags           = 0

kMDItemFSHasCustomIcon         = (null)

kMDItemFSInvisible             = 0

kMDItemFSIsExtensionHidden     = 0

kMDItemFSIsStationery          = (null)

kMDItemFSLabel                 = 0

kMDItemFSName                  = "test.txt"

kMDItemFSNodeCount             = (null)

kMDItemFSOwnerGroupID          = 20

kMDItemFSOwnerUserID           = 501

kMDItemFSSize                  = 0

kMDItemFSTypeCode              = ""

kMDItemKind                    = "일반 텍스트 도큐멘트"

kMDItemLogicalSize             = 0

kMDItemPhysicalSize            = 0


여기서 시간으로 쓰기에 적당한 필드는 kMDItemDateAdded 이다.

속성중에 특정 필드만 뽑아보기 위해서는 옵션 -name 과 속성 이름을 붙이면 된다.

➜  ~ mdls -name kMDItemDateAdded test.txt

kMDItemDateAdded = 2017-05-02 02:01:06 +0000


문제는 뒤에 +0000 도 있듯이 시간대가 GMT+0이다.

한국은 GMT+09인데 말이다.


그래서 다른 방법은 stat 명령을 이용하는 방법이다.

➜  ~ stat -f "%Sm" -t "%Y-%m-%d_%H.%M.%S" test.txt

2017-05-02_11.01.06

이번엔 로컬시간이 나온다. 훨씬 보기가 좋다.

원래. 시간 단위의 구분자로는 ISO 8601에서는 콜론(:)만을 허용한다. 하지만 파일 시스템에서는 콜론을 파일명으로 허용하지 않기 때문에 마침표(.)로 대신 한 것이다.


2. 파일 리스팅하기.

ls 명령이 있지만 이것은 말단 디렉토리가 아닐 경우 파일 이외에 디렉토리도 리스팅을 한다.

그래서 find 명령을 쓰기로 한다.

➜  ~ find . -maxdepth 1 -type f

./.bash_history

./.CFUserTextEncoding

./.DS_Store

...

문제는 DS_Store 같은 숨김파일도 같이 나온다는 것이다.

➜  ~ find . -maxdepth 1 -type f -not -path '*/\.*'

./04-14 16.16.pklg

./clientlist.txt

./epoch.js

./fastoredis.log

./java_error_in_idea.hprof

./java_error_in_idea_639.log

./test.txt

./withdash.js

이제 앞에서 ./만 지우면 된다.

이것은 TR(translate characters)명령, 즉 tr -d './' 을 사용하면 된다.

파이프로 연결하면 된다.

➜  ~ find . -maxdepth 1 -type f -not -path '*/\.*' | tr -d './'

04-14 1616pklg

clientlisttxt

epochjs

fastoredislog

java_error_in_ideahprof

java_error_in_idea_639log

testtxt

withdashjs




참고: 

https://developer.apple.com/legacy/library/documentation/Darwin/Reference/ManPages/man1/mdls.1.html

https://discussions.apple.com/thread/7119394?tstart=0

http://stackoverflow.com/questions/12169710/formatted-modified-date-time-on-mac-bash

http://stackoverflow.com/questions/27725408/alternative-to-colon-in-a-time-format

https://askubuntu.com/questions/266179/how-to-exclude-ignore-hidden-files-and-directories-in-a-wildcard-embedded-find