Re: Opposite of cp -u

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]



CentOS mailing list <centos@xxxxxxxxxx> writes:
I had at one point copied a large number of files between drives and did
not use the -p and thus the timestamps were all set to the date of the copy.

I did not catch this, and deleted the source.  So I 'lived' with it and
have since changed many files.

Well, yesterday I found a good backup of many of those files and I want
to restore them to their proper dates.

cp -p -u is exactly the opposite of what I want.  I want to copy only if
the source files have an earlier date than the destination files.

The source files are just an old copy on another drive that I found when
cleaning up things...


SRC="" /> DST=/the/working/tree
export SRC DST
find "$SRC" -type f -print | while read A; do [ "${A}" -ot "${DST}${A##$SRC}" ] && /bin/touch -r ${A} "${DST}${A##$SRC}"; done

Note that using this syntax, the two variables cannot be set in-place on the same command line as "find ..."; it only seems to work for me if they're exported as environment variables.

A more expanded version of the same, with commentary:

cat > fix_timestamps.sh << __EOF__
#!/bin/sh
### Scans a source directory for files, setting the dates of same-named files in a target directory
### Adam Thompson <athompson@xxxxxxxx> 2007-Aug-07
# Source directory - no need for trailing slash
SRC="" /> # Target directory - no need for trailing slash
DST=/the/working/tree
# Locate all _files_ only
find "$SRC" -type f -print | (  # subshell not necessary, only here for readability
        # read each line of input from the pipe into $A
        while read A; do
        # if's can be shortened to && most times
        # Proceed only if source file is OlderThan target file
        if [ "${A}" -ot "${DST}${A##$SRC}" ]; then
                # Proceed only if target file exists
                # Probably being paranoid, since -ot should have already failed...
                if [ -f  "${DST}${A##$SRC}" ]; then
                        # Use "touch" to reset the timestamp on the file \
                        #   instead of re-copying the data
                        # "-r" == "--reference", uses the source file's \
                        #   timestamp to set the destination file's timestamp
                        /bin/touch -r ${A} "${DST}${A##$SRC}"
                fi
        fi
        done
)
__EOF__


Obviously the one-liner above is going to be marginally faster, especially on slower CPUs, but the difference should be minimal - bash isn't that much of a CPU hog.

-Adam Thompson
 Divisional IT Department,  St. James-Assiniboia School Division
 150 Moray St., Winnipeg, MB, R3J 3A2
 athompson@xxxxxxxx / tel: (204) 837-5886 x222 / fax: (204) 885-3178
_______________________________________________
CentOS mailing list
CentOS@xxxxxxxxxx
http://lists.centos.org/mailman/listinfo/centos

[Index of Archives]     [CentOS]     [CentOS Announce]     [CentOS Development]     [CentOS ARM Devel]     [CentOS Docs]     [CentOS Virtualization]     [Carrier Grade Linux]     [Linux Media]     [Asterisk]     [DCCP]     [Netdev]     [Xorg]     [Linux USB]
  Powered by Linux