我正在尝试find
结合使用-exec
并chmod
通过 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。