cp without overwriting destination permissions
Solution 1
If you've only opened the manual for cp
...
The next will not overwrite the file permissions and ownership + groupship:
cp --no-preserve=mode,ownership /tmp/file /home/file
Note that root privileges are needed if you want to preserve the ownership and groupship.
An excerpt from the manual:
--preserve[=ATTR_LIST] preserve the specified attributes (default: mode,owner- ship,timestamps), if possible additional attributes: context, links, xattr, all
Solution 2
cat
will work, too:
cat /tmp/file > /home/file
Solution 3
By default, GNU cp
(version 8.32) will NOT overwrite destination permissions, so the question is moot:
% ls -li
total 8,192
19392015 -rwxrwxrwx 1 ravi ravi 4 Jan 3 16:54 bar*
19392014 -rw-r--r-- 1 ravi ravi 4 Jan 3 16:46 foo
% cp foo bar
% ls -li
total 8,192
19392015 -rwxrwxrwx 1 ravi ravi 4 Jan 3 16:57 bar*
19392014 -rw-r--r-- 1 ravi ravi 4 Jan 3 16:46 foo
%
In the case where the destination file is not writable (even though the directory is), cp
will say:
cp: cannot create regular file 'dest-file': Permission denied
Other options besides cp
:
cat
will preserve the inode and permissions of the destination file:
cat file-with-new-data > file-to-overwrite
However, redirections won't work with sudo
.
If you want to sudo
and keep the destination permissions, use this:
< file-with-new-data sudo tee file-to-overwrite > /dev/null
This is equivalent to the more verbose:
cat file-with-new-data | sudo tee file-to-overwrite > /dev/null
Related videos on Youtube
David
Updated on September 18, 2022Comments
-
David almost 2 years
How do you use the
cp
command without changing the target file's permissions? For example:cp /tmp/file /home/file
I don't want to change
chown
andchgrp
on/home/file
.-
Naman Bansal about 13 yearsIt's not clear whether you are asking about preserving the source permissions or the target permissions. You've also cross-site spammed to SuperUser.
-
mpersico about 7 yearsFor the record, the "preservation" options are in reference to the source.
cp -p
makes the target attributes match (thereby preserving) the source attributes. -
dozer about 7 yearsI just stumbled upon this page. cp by default ought to preserve the target files permissions and user:group because it opens the target in update mode and retaining its inode. So it's not clear to my why the answers don't indicate this.
-
Tom Hale over 3 yearsThis question is moot. GNU
cp
default behaviour is as desired by this question, as demonstrated here.
-
-
Pete over 8 yearsI didn't see a switch for this to preserve the target's ower or group. Just force it to a new value.
-
basin over 5 yearsNot exactly what the author wanted.
--no-preserve
makes sense if used after--preserve
(or its aliases), otherwise it doesn't affect the behavior ofcp
. The author wanted to keep the file mode of an existing target file and only overwrite its contents -
basin over 5 yearsEx: replace ssh host keys
cp --no-preserve=mode,ownership ssh* /etc/ssh/
. This makes the secret keys world-readable. -
beppe9000 over 4 yearsdoes it work for binary files too ?
-
Tom Hale over 3 years@beppe9000 yes,
cat
outputs whatever it inputs. -
Tom Hale over 3 yearsFor an answer that works with
sudo
, see here -
Tom Hale over 3 yearsThat actually forces overwriting of the target permissions -- it preserves the permissions of the source file.
-
Tom Hale over 3 years
--no-preserve=all
is default. And by default GNUcp
doesn't update target permissions anyway. -
pacoverflow about 3 yearsI verified cp version 8.26 also keeps the permissions/owner/group of the file being overwritten.