[CentOS] Opposite of cp -u
Adam Thompson
athompson at sjsd.net
Wed Aug 8 16:13:15 UTC 2007
CentOS mailing list <centos at centos.org> 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=/my/restored/files
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 at sjsd.net> 2007-Aug-07
# Source directory - no need for trailing slash
SRC=/my/restored/files
# 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 at sjsd.net / tel: (204) 837-5886 x222 / fax: (204) 885-3178
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.centos.org/pipermail/centos/attachments/20070808/47a03b6d/attachment.html>
More information about the CentOS
mailing list