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

Re: copy directory tree, mapping to new owners



On 9/12/2021 3:45 AM, Richard Hector wrote:
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.


If you are doing this in a script, I would use a temporary directory.
That way, in case of failure the destination directory is not rongly
modified.

EG:

$ rsync <src-dir> <tmp-dir>

Make <tmp-dir> the way you want it to be.

$ rsync <tmp-dir> <dest-dir>


Given that you want to change the ownership, you may want to emulate the
options implied by '-a' but without the ownership option ('-o').

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?

According to the man page it does (1):

"CWrsync -avz foo:src/bar/ /data/tmp
A trailing slash on the source changes this behavior to avoid creating
an additional directory level at the destination. You can think of a
trailing / on a source as meaning lqcopy the contents"

# I generally include it.

In a script, you need to be sure what the cmd does do or not do!!! :)

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?


Not that I can see but testing will tell!

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

At the very least, '<cmd> ['&&'|'||'] handle the error>.

If you use Bash and don't need to be POSIX compliant and /or portable
you can be a bit more creative.

and practice more - I tend to rely somewhat on 'knowing' what I'm
working with, which is probably not a good idea.
>

Yes in a script it is like shooting yourself in the foot.


1)  https://linux.die.net/man/1/rsync

--
John Doe


Reply to: