Answers:
chmod实用程序的GNU版本可以将模式从一个文件(RFile
)复制到另一个文件(file
)。
chmod --reference=RFile file
在大多数Linux发行版和Cygwin中,都可以找到GNU coreutils。 并非所有的chmod实现都提供此选项。
--reference
选项包含在GNU版本中;OSX可能会使用源自BSD 的chmod。OSX 人CHMOD:developer.apple.com/Mac/library/documentation/Darwin/Reference/...
cp -dpR <source-file> <dest-file>
将在复制文件时复制权限以及文件是很有用的。r
我想出了这个:
find $SOURCE -mindepth 1 -printf 'chmod --reference=%p\t%p\n'|sed "s/\t$SOURCE/ $DEST/g"|sh
它不是完全防弹的,但是可以满足我的需要。
尝试这个:
find /PATH/TO/TARGET -exec chmod --reference /PATH/TO/SOURCE/{} {} \;
这将递归地上移并chmod每个文件,如果两个目录在文件上不匹配,您将看到很多“无此文件或目录”错误。
find /home/myubuntuuser/Desktop/test1 -exec chmod --reference /home/myubuntuuser/Desktop/test2/{} {} \;
您可以getfacl
用来检索文件权限,所有者,组和其他ACL(访问控制列表)的完整列表。
$ getfacl filename.txt
# file: filename.txt
# owner: score
# group: score
user::rw-
group::---
other::---
如果将输出保存到文件(例如acl.txt
),则可以使用将该格式恢复setfacl --restore acl.txt
。如果您只想还原一个文件,并且该文件的文件名不同于原始文件名,则将要使用setfacl --set-file acl.txt filename.txt
(filename.txt
新文件名在哪里)。
将原始权限保存到acl.txt
:
$ getfacl filename.txt > acl.txt
覆盖权限(用于演示;这只是为了使您看到在下一步中进行还原是可行的)
$ chmod 777 filename.txt
$ sudo chown nobody:root filename.txt
$ ls -l filename.txt
-rwxrwxrwx 1 nobody root 0 Jan 8 14:24 filename.txt
用于setfacl
从还原正确的权限acl.txt
:
$ sudo setfacl --restore acl.txt
$ ls -l filename.txt
-rw------- 1 score score 0 Jan 8 14:24 filename.txt
文件名是从# file:
生成的注释中获取的getfacl
,因此无需在命令行上指定它。
如果要将这些权限还原到其他文件,可以使用--set-file
而不是--restore
这样:
$ setfacl --set-file acl.txt second_filename.txt
如果最终覆盖了中的某些文件的权限/usr
,但又不知道覆盖了哪些文件,通常可以通过从另一个类似配置的系统中还原来修复它。
来自工作系统的备份权限(注意:getfacl
生成相对路径,因此请确保您cd
在两台计算机上的位置都一致)
# cd /
# getfacl -R usr > /root/acls.txt
将ACL转储复制到权限已损坏的系统
$ scp root@working-system:/root/acls.txt .
$ scp acls.txt root@broken-system:/root/
恢复ACL转储,以用已知正常机器的权限覆盖破坏的权限
# cd /
# setfacl --restore /root/acls.txt