Unix:是否有一种“复制”文件或目录权限的方法?


14

我的目录中有两个文件。一个拥有正确的权限,而另一个则没有。有什么方法可以将一组权限从一个文件“复制”到另一个文件?

Answers:


15

chmod实用程序的GNU版本可以将模式从一个文件(RFile复制到另一个文件(file)。

chmod --reference=RFile file

在大多数Linux发行版和Cygwin中,都可以找到GNU coreutils并非所有的chmod实现都提供此选项。


嗯...看起来应该可以,但Mac OS X不支持吗?那里我只有非法的选择...
Svish 2010年

2
chmod不是bash内置命令。它是在许多UNIX上可用的独立实用程序。该--reference选项包含在GNU版本中;OSX可能会使用源自BSD 的chmod。OSX 人CHMODdeveloper.apple.com/Mac/library/documentation/Darwin/Reference/...
嘎嘎堂吉诃德

Svish,您可以考虑通过MacPorts安装GNU版本。
杰里米·L

只是想知道,在这里提到cp -dpR <source-file> <dest-file>将在复制文件时复制权限以及文件是很有用的。r
LawrenceC

1

我想出了这个:

find $SOURCE -mindepth 1 -printf 'chmod --reference=%p\t%p\n'|sed "s/\t$SOURCE/ $DEST/g"|sh

它不是完全防弹的,但是可以满足我的需要。


0

尝试这个:

find /PATH/TO/TARGET -exec chmod --reference /PATH/TO/SOURCE/{} {} \;

这将递归地上移并chmod每个文件,如果两个目录在文件上不匹配,您将看到很多“无此文件或目录”错误。


find /home/myubuntuuser/Desktop/test1 -exec chmod --reference /home/myubuntuuser/Desktop/test2/{} {} \;
里克·桑切斯

chmod:无法获取'/ home / myubuntuuser / Desktop / test2 // home / myubuntuuser / Desktop / test1'的属性:没有这样的文件或目录chmod:无法获取'/ home / myubuntuuser / Desktop / test2 // home / myubuntuuser / Desktop / test1 / 111.txt':无此类文件或目录chmod:无法获取'/home/myubuntuuser/Desktop/test2//home/myubuntuuser/Desktop/test1/222.txt'的属性:否此类文件或目录chmod:无法获取'/home/myubuntuuser/Desktop/test2//home/myubuntuuser/Desktop/test1/333.txt'的属性:无此类文件或目录
Rick Sanchez

在2个文件夹中对其进行了测试:test1和test2。每个文件都具有相同的文件111/222 / 333.txt,但具有不同的权限。test1具有默认值。test2具有777权限。这是我得到的错误。
里克·桑切斯

0

您可以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.txtfilename.txt新文件名在哪里)。

脚步

  1. 将原始权限保存到acl.txt

    $ getfacl filename.txt > acl.txt
    
  2. 覆盖权限(用于演示;这只是为了使您看到在下一步中进行还原是可行的)

    $ 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
    
  3. 用于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,但又不知道覆盖了哪些文件,通常可以通过从另一个类似配置的系统中还原来修复它。

  1. 来自工作系统的备份权限(注意:getfacl生成相对路径,因此请确保您cd在两台计算机上的位置都一致)

    # cd /
    # getfacl -R usr > /root/acls.txt
    
  2. 将ACL转储复制到权限已损坏的系统

    $ scp root@working-system:/root/acls.txt .
    $ scp acls.txt root@broken-system:/root/
    
  3. 恢复ACL转储,以用已知正常机器的权限覆盖破坏的权限

    # cd /
    # setfacl --restore /root/acls.txt
    
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.