Unix shell: 递归查找所有文件和目录的 chgrp,单个命名目录除外

Unix shell: Recursive find to chgrp on all files and dirs EXCEPT a single named dir

我看到一些与我使用修剪操作类似的请求,但我想做的是递归地浏览文档根目录:

/opt/web

其中包含几个文件和目录:

/opt/web/foo.html     (file)
/opt/web/bar.txt      (file)
/opt/web/DONOTCHGRP   (dir)
/opt/web/assets       (dir)

我想遍历整个 docroot,如果任何文件不属于 "mygroup" 组,则将组更改为 "mygroup" 并设置组写入权限位,除了完全忽略 DONOTCHGRP目录本身及其内容。

我目前有执行 chgrp/chmod 的命令,不对任何内容进行过滤:

find /opt/web -not -group mygroup |
    xargs -I {} sh -c '{ chmod g+w {}; chgrp mygroup {};}'

我只是不知道如何完全跳过 DONOTCHGRP 目录。任何帮助将不胜感激。

find 使用 -path-prune 选项可以很好地满足您的需求。例如,要在 /opt/web 目录下查找除名为 /opt/web/DONOTCHGRP 的目录之外的所有目录:

find /opt/web -path /opt/web/DONOTCHGRP -prune -exec <script> '{}' \;

然后简单地将你的 chmod g+w ""; chgrp mygroup ""; 包含在一个简短的 script 中并使其可执行(上面的 <> 只是为了强调而不是实际的一部分命令)。 find 将为所有文件和目录调用 script/opt/web/DONOTCHGRP 及其下方的 files/dirs 除外。

find /opt/web -not -group mygroup | 
grep -v -e IGNORE1 -e IGNORE2 -e IGNORE3 ... |  
xargs -I {} sh -c '{ chmod g+w {}; chgrp mygroup {};}'