有选择地使用 chmod 命令

11 command-line find chmod

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

find /main_directory/ -exec chmod 755 {} \;
Run Code Online (Sandbox Code Playgroud)

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

Kus*_*nda 21

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

chmod -R 755 /main_directory
Run Code Online (Sandbox Code Playgroud)

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

find /main_directory ! -perm 0755 -exec chmod 755 {} +
Run Code Online (Sandbox Code Playgroud)

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

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

find /main_directory   -type d ! -perm 0755 -exec chmod 755 {} +
find /main_directory ! -type d ! -perm 0644 -exec chmod 644 {} +
Run Code Online (Sandbox Code Playgroud)