如何通过 SSH 一次性更改文件和目录权限?

如何通过 SSH 一次性更改文件和目录权限?

我正在尝试find结合使用-execchmod通过 SSH 递归更改文件夹内每个文件和目录的权限。

我想在一行中执行这两个命令:

find /share/Multimedia/ -type f -exec chmod 644 {} \;
find /share/Multimedia/ -type d -exec chmod 755 {} \;

我之前在别人发布的帖子中找到了解决方案,但由于某种原因,我的 bash 命令历史记录被清除了,我没有记下我在其他地方使用的语法以供参考。我并不经常这样做,所以我对标准 Unix 命令不太了解。

我使用了类似如下的方法:

# probably won't execute
find /share/Multimedia/ ( if -type f -exec chmod 644 {} \; else if -type d -exec chmod 755 {} \; )

我只想时不时地在我的 NAS 上运行它,以一次性规范化权限,同时在我的 NAS 处理它时可能无人值守地做其他事情。

答案1

您可以利用 的find表达系统的 and-or 结构来做到这一点:

find /share/Multimedia/ -type f -exec chmod 644 {} \; -o -type d -exec chmod 755 {} \;

本质上,这有以下逻辑:

IF:
    the item is a plain file
    AND the chmod 644 command succeeds on it
OR
    the item is a directory
    AND the chmod 755 command succeeds on it
THEN
    ... well, do nothing; normally it'd print the item's path, but since
    there's a -exec in the expression, that gets skipped

但实际上有一个更简单的方法:

chmod -R u=rwX,go=rX /share/Multimedia/

这利用了 的chmod“X”权限,这意味着“执行,但前提是有意义”。通常,这意味着它会在目录上设置执行权限,但不在纯文本上设置执行权限。主要的潜在问题是,如果它看到纯文本文件上的执行权限,它会认为这是故意的并保留它,因此在有人浏览并为所有内容分配执行权限后,这种情况不会得到解决。

答案2

首先,if是shell的关键字,而不是find的关键字,所以不能将其用作选项。

其次,你可能正在寻找类似的东西:

find /share/Multimedia/ -exec sh -c 'if [ -f {} ]; then chmod 644 {}; else chmod 755 {}; fi' \;

我们只是使用我们的 shell 检查元素是否是一个文件,然后if [ -f {} ]我们根据文件或目录的需要对其进行 chmod。

相关内容