(从 :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
。