(来自: https : //stackoverflow.com/questions/15245144/copy-file-permissions-but-not-files ,因为脱离主题而closures)
我有两个相同的目录树的副本。 他们几乎都有相同的文件(一个版本可能有一些额外的或丢失的文件)。 但是,大部分文件对于两个目录是相同的(具有相同的相对path和所有内容)。
假设这些在目录中:
version1/ version2/
问题是版本1中的权限/搞砸了,我想从版本2 /复制权限,但没有replace版本1 /这是更新的文件。
有没有一种通过shell命令或脚本执行此操作的自动化方法?
自从coreutils 8.6以来,GNU cp就知道了--attributes-only标志
– 属性 – 只是不复制文件数据,只是属性
我的版本的cp没有--attributes-only标志,所以我研究了这个。 简单地testing简单的文件夹,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
你可以,但我不认为在一个“自动化的方式”!
GNU chown和GNU chmod有一个你可以使用的--reference=RFILE参数。
chown --reference=RFILE yourfile chmod --reference=RFILE yourfile
它使用RFILE设置(权限,所有者,组等),并将它们复制到您的文件。
该手册更详细地解释。
在我的情况下,我通过使用“stat”命令与“find”和“vi”来创build应用权限的脚本。
cd version1/ find . -exec stat -c '%a %n' "{}" \; > setPerm.sh vi setPerm.sh
进入“vi”后,我在所有的行中插入了“chmod”命令: %s/^/chmod /g我复制了version2/目录下的脚本并执行它。
其他解决scheme似乎有效,但我不testing它们以防万一。
受到Mariano Paniga的回答的启发,我觉得我有一个更好的,不需要vi和search/replace命令。 我甚至想要复制所有权信息(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 。