我目录中有两个文件。一个具有正确的权限,另一个则没有。有没有办法将权限集从一个文件“复制”到另一个文件?
答案1
GNU 版本的修改模式公用事业罐复制模式从一个文件(RFile
)到另一个文件(file
)。
chmod --reference=RFile file
GNU 核心实用程序在大多数 Linux 发行版和 Cygwin 以及其他地方都可以找到。 并非全部修改模式实现提供此选项。
答案2
我想到了这个:
find $SOURCE -mindepth 1 -printf 'chmod --reference=%p\t%p\n'|sed "s/\t$SOURCE/ $DEST/g"|sh
它不是完全防弹的,但是可以满足我的需要。
答案3
尝试这个:
find /PATH/TO/TARGET -exec chmod --reference /PATH/TO/SOURCE/{} {} \;
这将递归地向上并 chmod 每个文件,如果两个目录上的文件不匹配,您将看到很多“没有这样的文件或目录”错误。
答案4
您可以使用它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