Copy file permissions, but not files in Unix

(From : https://stackoverflow.com/questions/15245144/copy-file-permissions-but-not-files, closed because off-topic)

I have two copies of the same directory tree. They almost have the same files in both (one version may have a couple extra or missing files). However, most of the files are in common to both directories (have the same relative paths and everything).

Assume these are in directories:

version1/
version2/

The problem is that the permissions in version1/ got messed up, and I would like to copy over the permissions from version2/, but do it without replacing the files in version1/ which are newer.

Is there an automated way to do this via shell commands or scripts?


Solution 1:

GNU cp knows the --attributes-only flag since coreutils 8.6

--attributes-only don't copy the file data, just the attributes

Solution 2:

My version of cp doesn't have the --attributes-only flag, so I worked up this. Briefly tested on simple folders, YMMV.

$> ls
version1/
version2/
$> ls -l version1/1/a
-rw-rw-r-- 1 alex alex 0 Feb  5 12:49 version1/1/a
$> ls -l version2/1/a
-rwxrwxrwx 1 alex alex 0 Feb  5 12:49 version1/1/a

$> find version1 -type f -printf '%P\n' | xargs -I {} \
    chmod --reference=version1/{} version2/{}

$> ls -l version2/1/a
-rw-rw-r-- 1 alex alex 0 Feb  5 12:49 version1/1/a

Solution 3:

You can, but i don't think in an "automated way" !

GNU chown and GNU chmod have a --reference=RFILE parameter you can use.

chown --reference=RFILE yourfile
chmod --reference=RFILE yourfile

It uses RFILE settings (permissions, owner, group, etc..) and copies them to yourfile.

the manual explains in more detail.