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

Re: copy directory tree, mapping to new owners



On 12/09/21 12:52 pm, Greg Wooledge wrote:
On Sun, Sep 12, 2021 at 12:43:29PM +1200, Richard Hector wrote:
The context of my question is that I'm creating (or updating) a test copy of
a website. The files are owned by one of two owners, depending on whether
they were written by the server (actually php-fpm).

To do that, I want all the permissions to remain the same, but the ownership
should be changed according to a provided map. For example, if the old file
was owned by 'mysite', the copy should be owned by 'mysite_test'. If the old
file was owned by 'mysite-run' (the user php runs as), the copy should be
owned by 'mysite_test-run' (if that has to be 'mysite-run_test' to make
things easier, I can live with that).

cd /src
mkdir -p /dest
rsync -a . /dest/      # The trailing / matters.
cd /dest
find . -user mysite -exec chown mysite_test {} +
find . -user mysite-run -exec chown mysite-run_test {} +

Thanks, that looks reasonable. It does mean, though, that the files exist for a while with the wrong ownership. That probably doesn't matter, but somehow 'feels wrong' to me.

My habits would also lead me to do all of the above from above the two directories in question (in my case, /srv - for /srv/mysite/doc_root and /srv/mysite_test/doc_root) So:

cd /srv

# actually not necessary? rsync will create it
mkdir -p mysite_test/doc_root

# The trailing / matters. Does it matter on the source as well?
# I generally include it.
rsync -a mysite/doc_root/ mysite_test/doc_root/ # The trailing / matters.

find mysite_dest -user mysite -exec chown mysite_test {} +

# I prefer mysite_test-run; it keeps consistency with
# the ${sitename}-run pattern used elsewhere
find mysite_dest -user mysite-run -exec chown mysite_test-run {} +

Have I broken anything there?

This is what I would do.  And I would do it *interactively*.

If you insist on making a script, then it will be slightly more
complicated, because you'll need to add error checking.

The trouble with doing it interactively, when it needs to be done many times (and on several sites), is that each time there's opportunity to make a mistake. And it means the process needs to be documented separately from the script.

In fact, I'd incorporate the above in a larger script, which does things like copying the database (and changing the db name in the site config).

Error checking in shell scripts is something I certainly need to learn and practice more - I tend to rely somewhat on 'knowing' what I'm working with, which is probably not a good idea.

Thanks,
Richard


Reply to: