复制文件权限,但不复制 Unix 中的文件

复制文件权限,但不复制 Unix 中的文件

(从 :https://stackoverflow.com/questions/15245144/copy-file-permissions-but-not-files,因偏离主题而关闭)

我有同一目录树的两个副本。它们几乎都包含相同的文件(一个版本可能有几个多余或缺失的文件)。但是,大多数文件对于两个目录都是相同的(具有相同的相对路径和所有内容)。

假设这些位于目录中:

version1/
version2/

问题是 version1/ 中的权限混乱了,我想从 version2/ 复制权限,但是不替换 version1/ 中较新的文件。

是否有通过 shell 命令或脚本自动完成此操作的方法?

答案1

GNU cp 知道这个--attributes-only标志,因为coreutils 8.6

--attributes-only 不复制文件数据,只复制属性

答案2

我的版本cp没有该--attributes-only标志,所以我做了这个。在简单文件夹上进行了简短测试,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

答案3

你可以,但我不认为这是“自动化的方式”!

GNU chown 和 GNU chmod 有一个--reference=RFILE您可以使用的参数。

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

它使用RFILE设置(权限、所有者、组等)并将它们复制到yourfile

手册解释得更详细。

答案4

受到 Mariano Paniga 的回答的启发,我想我有一个更好的答案,不需要 vi 和搜索/替换命令。我甚至还想复制所有权信息 (uid/gid)。

cd version1/
find . -exec stat -c 'chmod %a %n; chown %U:%G %n' "{}" \; > /tmp/setPerm.sh
chmod u+x /tmp/setPerm.sh
cd ../version2
/tmp/setPerm.sh

您可以将里面的命令自定义stat -c '...'为您想要的任何内容。有关所有可用选项,请参阅man stat

相关内容