Jay Taylor's notes

back to listing index

linux - How to save and restore file's created/modified dates? - Super User

[web search]
Original source (superuser.com)
Tags: filesystem one-liners perl timestamp superuser.com
Clipped on: 2020-04-18

I've copied a bunch of files from one server to the other, and now the files' dates are reset to current.

How to backup files' dates on old server and restore the them on the new one (without re-transferring all files)?

Image (Asset 2/7) alt=
If you version of cp (or scp) has the -p or the --preserve option, you should have used it! Don't forget it next time... – gniourf_gniourf Dec 2 '12 at 21:31
  • I used find ... | cpio ... | mcrypt ... | pv ... | nc -lp 1 – Vi. Dec 3 '12 at 0:16
  • none
    7
    Thanks for submitting an edit. It is only visible to you until it’s been approved by trusted community members

    Here are scripts to save and restore all {c,n,a}times of files and directories:

    Save

    find / -mount -print0 | perl -ne 'INIT{ $/ = "\0"; use File::stat;} chomp; my $s = stat($_); next unless $s; print $s->ctime . "/" . $s->mtime . "/" . $s->atime ."/$_\0"; ' > dates.dat
    

    Restore: one-liner

    cat dates.dat |  perl -ne 'INIT{ $/ = "\0";} chomp; m!^([0-9]+)/([0-9]+)/([0-9]+)/(.*)!s or next; my ($ct, $mt, $at, $f) = ($1, $2, $3, $4); utime $at, $mt, $f;'
    

    One important aspect to note is this solution doesn't save or restore the ctime (or "change time") inode attribute. The ctime inode attribute tracks the last time attributes on the file, such as permissions, were modified.


    Expanded, readable form

    For those interested in inspecting or learning the details of how this works.

    Save

    find / -mount -print0 \
        | perl -ne '
            INIT{ $/ = "\0"; use File::stat;}
            chomp; my $s = stat($_);
            next unless $s;
            print $s->ctime . "/" . $s->mtime . "/" . $s->atime ."/$_\0";' \
        > dates.dat
    

    Restore

    cat dates.dat \
        | perl -ne '
            INIT{ $/ = "\0";}
            chomp;
            m!^([0-9]+)/([0-9]+)/([0-9]+)/(.*)!s or next;
            my ($ct, $mt, $at, $f) = ($1, $2, $3, $4);
            utime $at, $mt, $f;'
    
    Image (Asset 3/7) alt=

    I have a Python script for doing this at https://github.com/robertknight/mandrawer/blob/master/save-file-attrs.py

    On the original server run:

    save-file-attrs.py save scp .saved-file-attrs <user>@<dest-server>:<path>

    On the destination server run:

    cd <path> save-file-attrs.py restore

    This will restore the file attributes.

    answered Dec 3 '14 at 17:15
    Image (Asset 4/7) alt=

    You can use stat to get the dates on the source and touch to modify them on the target.

    answered Dec 2 '12 at 20:11
    Image (Asset 5/7) alt=
    How to do it automatically for a bunch of files (including ones with special names)? I don't want to stat and touch each file manually. – Vi. Dec 2 '12 at 21:04
  • You'd have to use a script. I'd do something with find, piped into a while statement, then parsing the output of stat for each file and applying with touch to the source. The actual implementation will depend on the particular file structure involved. – MaQleod Dec 2 '12 at 21:34
  • OK, implementing the script myself (I thought there should be a tool fo this or someone already having such script). – Vi. Dec 3 '12 at 0:12
  • 2

    If file names are not too weird, and I only need to restore mtime, I use this quick & dirty solution:

    find . -type f -exec stat -c 'touch --no-create -d "%y" "%n"' {} \;
    

    This creates a script on the source, and that script can be run on the destination to restore the mtime timestamps.

    answered Oct 20 '13 at 15:47
    Image (Asset 6/7) alt=
    A probably faster alternative is find . -type f -printf 'touch --no-create -d "%t" "%p"\n' because it doesn't fork. But it still needs some improvement (stable time format) – Daniel Alder Jul 9 '14 at 19:51
  • I've been using find . -type f -exec stat -c 'touch --no-create -d @%Y "%n"' {} \; >restore-timestamps (timestamps instead of local date representation). – rdesgroppes Aug 23 '19 at 13:48
  • Your Answer

    Community wiki

    Not the answer you're looking for? Browse other questions tagged or ask your own question.

    Hot Network Questions