Keep The Creation aka Birth Timestamp When Copying A File On A Mac In Python

November - 2021

NOTE: I'm not sure this is accurate. It looked like it when I first tested it, but I'm not sure now.

Leaving here until I can investigate further.


This is how you can make a copy of a file and maintain its "birth" time.

Note: I'm pretty sure you need XCode to get the SetFile command.

NOTE:

# this is the command to get the birth time of the inode
stat -f "%B" file_name
# and this is for the file modified time:
stat -f "%m" file_name

TODO: Formatting

import subprocess
import time

def copy_file_keeping_creation_date(source_path, dest_path):
    # TODO: Add error handling in all this
    creation_time = subprocess.run(['stat', '-f', '%B', src_path], stdout=subprocess.
PIPE).stdout.decode('utf-8')
    date_string = time.strftime('%m/%d/%Y %H:%M:%S', time.localtime(int(creation_time)))
    copy2(src_path, dest_path)
    response = subprocess.run(['SetFile', '-d', date_string, dest_path])
    print(response)
    # TODO: Make a better response
    
    
Notes:

- copy2 copies the most metadata of the possible python options, but still doesn't do the birth time. 
- `rsync -a` doesn't copy it either. 
- TODO: show examples from `stat` command 
- TODO: put in details about the four times available for files. 

links:

- https://apple.stackexchange.com/a/99599/7828
- https://stackoverflow.com/a/56009590/102401

TODO: Look at adding an answer to this one:

https://stackoverflow.com/questions/56008797/how-to-change-the-creation-date-of-file-using-python-on-a-mac

TODO: Look at this answer and see if there's something in that pathlib that can be used for finding the data instead of using `stat` - https://stackoverflow.com/a/52858040/102401

TODO: Look at `cp -p` to see what it perserves. According to the comment on this answer (https://stackoverflow.com/a/17685271/102401) that's what copy2 is supposed to do. Check it with `stat` and see if it keeps the birth timestamp.