touch
명령어는 기존 파일의 날짜(타임스탬프)를 임의로 변경해주는 역할을 합니다. 타임스탬프 변경은 소스 파일을 컴파일하거나 임의의 액세스 시점을 파악하기 위해서 주로 사용됩니다.
또한 touch
명령어는 파일이 존재하지 않을 경우 아무런 내용이 없는 빈 파일을 생성해주는 역할을 합니다.
먼저 아무런 옵션을 넣지 않고 인자값에 파일 이름만 지정해보겠습니다.
$ touch testfile
만약 testfile 이라는 파일이 없을 경우 0바이트의 새로운 빈 파일이 생성됩니다.
$ ls -al total 4 drwx------. 16 user user 4096 Jan 13 19:15 . drwxr-xr-x. 3 root root 18 Oct 13 16:02 .. -rw-rw-r--. 1 user user 0 Jan 13 19:15 testfile
파일명을 계속 입력하여 여러 파일을 동시에 생성할 수도 있습니다.
$ touch testfile1 testfile2 testfile3 testfile4
touch
명령어에 -c
옵션을 붙이면 파일이 없어도 별도로 생성하지 않게 됩니다.
$ touch -c testfile $ ls -al total 4 drwxrwxr-x. 2 test test 6 Jan 13 19:15 . drwx------. 17 test test 4096 Jan 13 19:15 ..
리눅스 파일 시스템의 타임스탬프는 atime(접근 시간), mtime(수정 시간), ctime (변경 시간)의 세 가지로 구성되어 있습니다.
포스팅 편의상 a/m/ctime
으로 표기하겠습니다. 이 세 가지 개념은 다음 포스트에 자세히 설명되어 있습니다.
현재 파일의 타임스탬프 값은 stat
명령어를 통해 확인이 가능합니다. stat [filename]
을 입력하여 현재 타임스탬프 값을 확인해보겠습니다.
$ stat testfile File: ‘testfile’ Size: 0 Blocks: 0 IO Block: 4096 regular empty file Device: fd00h/64768d Inode: 101254431 Links: 1 Access: (0664/-rw-rw-r--) Uid: ( 1000/ test) Gid: ( 1000/ test) Context: unconfined_u:object_r:user_home_t:s0 Access: 2019-01-13 19:15:59.084552439 +0900 Modify: 2019-01-13 19:15:59.084552439 +0900 Change: 2019-01-13 19:15:59.084552439 +0900 Birth: -
touch
명령어로 생성된 파일은 이 세 가지 타임스탬프 값을 생성한 시각 대로 지정합니다.
이미 만들어진 파일에 또 다시 옵션 없이 touch
명령어를 사용하면 atime과 mtime, ctime이 모두 현재 시각으로 업데이트될 것입니다.
$ touch testfile // 새로운 파일이 생성됨 $ stat testfile ... Access: 2019-01-13 21:03:08.790886454 +0900 Modify: 2019-01-13 21:03:08.790886454 +0900 Change: 2019-01-13 21:03:08.790886454 +0900 ... $ touch testfile // 기존의 파일에 업데이트됨 $ stat testfile ... Access: 2019-01-13 21:09:02.086230538 +0900 Modify: 2019-01-13 21:09:02.086230538 +0900 Change: 2019-01-13 21:09:02.086230538 +0900 ...
만약 파일에 액세스하지 않고 단순히 날짜만 수정했다는 의미로 타임스탬프를 변경하고 싶다면 atime을 건드리지 않아야 할 것입니다.
이 때는 -m
옵션을 붙여서 사용하면 됩니다. mtime과 ctime이 변경될 것입니다.
$ touch -m testfile // 기존의 파일에 업데이트됨 $ stat testfile ... Access: 2019-01-13 21:09:02.086230538 +0900 Modify: 2019-01-13 21:11:15.087689025 +0900 Change: 2019-01-13 21:11:15.087689025 +0900
반대로 파일에 액세스한 시각(atime)만 변경하고 싶다면 -a
옵션을 붙여주면 됩니다. 이번에는 mtime을 제외한 시각이 모두 현재 시각으로 업데이트되었습니다.
$ touch -a testfile // 기존의 파일에 업데이트됨 $ stat testfile ... Access: 2019-01-13 21:10:46.540865813 +0900 Modify: 2019-01-13 21:11:15.087689025 +0900 Change: 2019-01-13 21:10:46.540865813 +0900
이 두 가지 옵션을 사용해도 ctime은 항상 변경될 것입니다. 왜냐하면 ctime은 inode의 값이 변경될 때 마다 자동으로 업데이트되기 때문입니다.
지금까지는 현재 시각(명령을 실행한 시각)을 기준으로 타임스탬프 값을 변경하였습니다. 그렇지만 특별히 변경하고 싶은 시간대가 있다면 -t
옵션을 사용하여 임의의 시간대를 지정해주시면 됩니다. (사용 포맷은 [[CC]YY]MMDDhhmm[.ss]
입니다.)
위에서 설명한 -a 옵션을 사용하여 atime을 2019년 1월 1일 오후 12시 30분 59초
로 맞추어보겠습니다.
$ touch -a -t 201901011230.59 testfile
stat
명령어로 변경된 시각을 확인해보면 atime이 2019년 1월 1일 오후 12시 30분 59초
로 변경되었음을 알 수 있습니다.
$ stat testfile ... Access: 2019-01-01 12:30:59.000000000 +0900 Modify: 2019-01-13 21:05:59.087689025 +0900 Change: 2019-01-13 21:16:28.579628876 +0900 ...
주의할 점은 이번에는 ctime이 2019년 1월 1일 오후 12시 30분 59초
가 아닌, 현재 시각(명령을 실행한 시각)으로 변경되었다는 것입니다. ctime은 언제나 inode가 변경된 최종 시각을 기준으로 시각을 업데이트하기 때문입니다.
마지막으로 특정 파일의 시각 정보를 다른 파일로 덮어씌울 수 있습니다. 다음은 testfile2의 atime, mtime을 testfile1의 atime, mtime과 동일하게 설정하는 명령어입니다.
$ touch -r testfile1 testfile2
Xcode에서 iOS 애플리케이션을 빌드(Archive)하고 App Store Connect에 앱을 업로드하는 도중, 아래와 같은 에러가 발생하면서 더…
INSTALL_FAILED_INSUFFICIENT_STORAGE 문제 안드로이드 스튜디오에서 에뮬레이터를 실행하고 개발중인 애플리케이션을 실행하려 하면 로그 창에 아래와 같이 표시되면서…
리눅스 명령어 - kill, killall 리눅스 kill 명령어는 특정 프로세스를 종료해주는 명령어입니다. 백그라운드에서 실행되고 있는…
JavaScript는 역사가 긴 스크립트 프로그래밍 언어입니다. 세월이 흐르면서 많은 자바스크립트 표준이 만들어졌고, 현재는 많은 문법적…
NodeJS 테스트 프레임워크인 Mocha는 비동기 테스트를 지원합니다. 간혹 특정 테스트 스크립트를 작성하고 실행하면 아래와 같이…