{ 11 comments… read them below or add one }

1 Casper Pedersen January 3, 2008 at 4:32 pm

This will also copy files to home directory of system users (not all of them have home directories).

This will prevent that this happens.

ID=$(id -u $u)
if [ $ID -ge 1000 ] ; then
if [ -d ${UHOME}/${u} ] ; then
… do copy here….


2 nixCraft January 3, 2008 at 4:45 pm


Yeah, you got a valid point there.

Appreciate your post.


3 Ilias Marinos January 3, 2008 at 6:16 pm

marinosi@lucifer:~$ id -u nobody

I’m pretty sure you don’t want to copy something to the nonexistent nobody’s homedir. :-P

Someone , could have in the system other accounts that cannot login (or don’t have a home dir etc)..One way to find the active users of a system is :

$ cat /etc/shadow | grep -v ‘[*!]’

Users who are inactive(have disabled accounts ) have a * or $ (these users cannot login) at the field where they should have the password hash.


4 nixCraft January 3, 2008 at 6:38 pm


The post has been updated. Thanks for sharp observation.


5 Jeff Schroeder January 3, 2008 at 9:19 pm

Instead of using cp… chown… use the install command. It does the same thing.


6 Vincent January 7, 2008 at 1:25 am

If you don’t have your users in /etc/passwd, but for instance in ldap, you can use `getent passwd` instead.


7 Alex Gretlein May 3, 2008 at 10:32 pm

You also need to safely handle pre-existing files of the same name. You can use the –backup option with install or cp, but you probably want to log it and/or inform users in some way.


8 Indie September 11, 2009 at 8:09 pm

The users home directory isn’t necessarily in the /home directory, you should read it from the ‘directory’ field in /etc/passwd – field 6
UHOME=$(grep '^${u}' /etc/passwd | cut -d: -f6)


9 gerar April 8, 2011 at 7:53 pm

hmm… errr…..

if you chown $_dir/${FILE} then you are trying to chown a nonexistant file,
as this expands to /home/user//nas05/.newconfig-file

chown $(id -un $u):$(id -gn $u) “$_dir/${FILE}”

Maybe if you created a new variable:

then you changed the chown line:
chown $(id -un $u):$(id -gn $u) “$_dir/${FILENAME}”
it would expand properly?


10 xris March 30, 2012 at 4:09 pm

What if I want to copy into a folder? (ie: ~Desktop/) or other and that folder does not exist.
I know you can include a test to see if it exists or not, and create it if necessary.


11 6lings June 18, 2013 at 9:51 am

Thanks for this post, was helpful
For more compatibility with others OS than Linux (Solaris, HP-UX…) i get the uid / gid using old fashionned way
_uid=”$(getent passwd | grep ${u} | cut -d: -f3)”
_gid=”$(getent passwd | grep ${u} | cut -d: -f4)”

and i get the users with getent aswell as i am using an LDAP
_USERS=”$(getent passwd | awk -F':’ ‘{ if ( $3 >= 500 ) print $1 }’)”


Leave a Comment

Tagged as: , , , , , , , , , , , , , , , , , , ,

Previous post:

Next post: