有选择地使用chmod命令


11

我想对特定目录下的所有文件和子目录设置755权限,但是我只想对不具有755权限的那些组件执行chmod 755。

find /main_directory/ -exec chmod 755 {} \;

如果find命令返回一个长列表,则将花费大量时间。我知道我可以使用stat命令来检查每个组件的八进制文件级别权限,然后使用if-else来切换文件权限,但是是否有任何单行方法使用findxargs首先检查文件/目录具有的权限,然后将chmod其更改为755(如果设置为其他值)。


6
这可能是过早的优化,甚至可能无法实现。进行所有这些检查可能会减慢速度。如果您需要做很多事情,那么确保它更快的测试只会带来回报。
ctrl-alt-delor

3
您可能不想授予所有文件执行权限。这将产生安全风险。(这是Microsoft Windows上的病毒载体之一:所有文件都是可执行的)。在符号模式下,您可以说u+rw,go+r,go-w,ugo+X-注意大写字母。
ctrl-alt-delor

我同意@ ctrl-alt-delor,但建议的条件更接近您的要求,u = rwX,go = rX应该可以达到相同的目的。
penguin359 '19

Answers:


21

如果您想同时更改755文件和目录的权限,则使用find(至少从性能的角度来看)并没有真正的好处,您可以这样做

chmod -R 755 /main_directory

如果您真的想find避免更改已拥有755权限的事物的权限(以避免更新其ctime时间戳),那么还应该测试每个目录和文件上的当前权限:

find /main_directory ! -perm 0755 -exec chmod 755 {} +

-exec ... {} +会收集尽可能多的路径名的可能,经过! -perm 0755测试,并执行chmod一次对所有的人。

通常,人们希望分别更改文件和目录的权限,以使并非所有文件都是可执行的:

find /main_directory   -type d ! -perm 0755 -exec chmod 755 {} +
find /main_directory ! -type d ! -perm 0644 -exec chmod 644 {} +

像魅力一样工作,谢谢。此致Kumarjit
Kumarjit Ghosh

1
我怀疑使用+而不是在;这里有很大的不同。
凯文(Kevin)

这是快速的方法-避免检查。我将进一步使用find列出仅您有权更改的文件,这样可以避免chmod无法更改无法更改的文件。<pre> <code>#rwx,rw,wx,w仅找到。-用户$(whoami)-烫发/ 002!-perm 0755 -exec chmod 0755 {} \; #分成两个操作查找。-用户$(whoami)-烫发/ 002!-perm 0755> /tmp/chfiles.txt for $(</ tmp / chfiles.txt)中的文件做chmod --quiet 0755“ $ {file}”完成</ code> </ pre>
克里斯·里德

@ChrisReid注意,如果任何路径名包含空格字符,则遍历这样的路径名列表将中断。
库萨兰达

我猜您需要在脚本中将内部字段分隔符(IFS)更改为'\ n'。这些是环境设置,shell解释它们的方式取决于这些设置的值。我先在虚拟文件上测试脚本,然后再使用它们来发掘错误的灾难,例如重命名文件或覆盖它们。我喜欢设置IFS的shell printf方法。IFS = $(printf“ \ n”)#可读性强
克里斯·里德

1

正如find已经掌握的-exec ... +语法,使用并没有多大意义xargs,但是您可以要求:

find /main_directory -not -perm 0755 | xargs chmod 755

1
还要注意,如果没有潜在的攻击者可以创建包含空格或其他特殊字符的文件名,则不带xargs -0(与infind 结合使用-print0;它是GNU扩展)可能会在安全方面造成很大的问题。因此-exec,请

不需要xargs(只需使用-exec),如果您确实使用它,则应使用-print0/ -0像Matija所说的那样。
凯文(Kevin)
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.