Why do I want to do this? Because I tried changing it out of curiosity, and I could not do it, so my brain tricked me into spending some time on it.

A file has three timestamps associated with it. The three are

time_t    st_atime;   /* time of last access */
time_t    st_mtime;   /* time of last modification */
time_t    st_ctime;   /* time of last status change */

The field st_atime is changed by file accesses, for example, by execve(2), mknod(2), pipe(2), utime(2) and read(2) (of more than zero bytes). The field st_mtime is changed by file modifications, for example, by mknod(2), truncate(2), utime(2) and write(2) (of more than zero bytes). The field st_ctime is changed by writing or by setting inode information (i.e., owner, group, link count, mode, etc.).

A directory listing with ls -l shows a timestamp, and this is the ctime. The stat(1) utility shows the three timestamps along with some other info:

$ stat tags
  File: ‘tags’
  Size: 73129       Blocks: 144        IO Block: 4096   regular file
Device: fe00h/65024d    Inode: 5506684     Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1000/     dag)   Gid: (  100/   users)
Access: 2013-11-20 01:55:34.918454212 +0100
Modify: 2013-11-20 01:55:34.918454212 +0100
Change: 2013-11-20 01:55:34.918454212 +0100
 Birth: -

Changing the first two; atime and mtime can be done with the touch utility with the -t option like this:

touch -t 190403061445 file

This is the year 1904, March 6 14:15.

Now stat yields this;

$ stat tags
  File: ‘tags’
  Size: 73129       Blocks: 144        IO Block: 4096   regular file
Device: fe00h/65024d    Inode: 5506684     Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1000/     dag)   Gid: (  100/   users)
Access: 1904-03-06 14:45:00.000000000 +0100
Modify: 1904-03-06 14:45:00.000000000 +0100
Change: 2013-11-20 01:56:14.775123866 +0100
 Birth: -

Changing the ctime however turned out to be difficult. After an intense googling session I have learned that there are no system calls for changing the ctime. An obvious option is to unmount the filesystem, and edit the inode manually. Not something I want to learn today.

To change the ctime, just change the system clock and touch it!

$ date -s "11/20/2003 01:05:00"
$ touch file

Then set the clock back to its rightful right place.

$ stat tags
  File: ‘tags’
  Size: 73129       Blocks: 144        IO Block: 4096   regular file
Device: fe00h/65024d    Inode: 5506684     Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1000/     dag)   Gid: (  100/   users)
Access: 2003-11-20 12:48:10.206667431 +0100
Modify: 2003-11-20 12:48:10.206667431 +0100
Change: 2003-11-20 12:48:10.206667431 +0100
 Birth: -