【问题标题】:Unix shell: Recursive find to chgrp on all files and dirs EXCEPT a single named dirUnix shell:递归查找所有文件和目录的chgrp,除了一个命名的目录
【发布时间】:2015-03-25 20:45:05
【问题描述】:

我看到一些使用 prune 操作的请求与我的请求相似,但我想做的是递归地浏览 docroot:

/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 不遵循符号链接,除非您强制它这样做。然后,您可以将目录移回。第二种模式可以最大限度地减少出现风险的时间。

标签: shell unix recursion find chgrp


【解决方案1】:

find 使用 -path-prune 选项可以很好地为您做到这一点。例如查找/opt/web目录下除/opt/web/DONOTCHGRP之外的所有目录:

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

然后简单地将您的chmod g+w "$1"; chgrp mygroup "$1"; 包含在一个简短的script 中并使其可执行(上面的&lt;&gt; 只是为了强调而不是实际命令的一部分)。 find 将为所有文件和目录调用script,除了/opt/web/DONOTCHGRP 和它下面的文件/目录。

【讨论】:

  • '使用+ 选项代替\; 会很好,但脚本需要使用"$@" 代替"$1"
  • 是的,同意,但我希望避免解释中的微妙之处以及 -exec-exedir 的差异。
  • 这与我想要的完全相反——它只设置了组并更改了 DONOTCHGRP 目录的模式。经过一番研究,我在命令中添加了 -o(逻辑或): find ${TARGET_PATH} -path ${SKIPPATH} -prune -o -exec ${SCRIPT} '{}' \;它奏效了。非常感谢您的帮助!!
  • 如果您没有为/opt/web 使用绝对路径,则相应地调整修剪。例如find . -path ./opt/web/DONOTCHGRP -prune -exec &lt;script&gt; '{}' \;
【解决方案2】:
find /opt/web -not -group mygroup | 
grep -v -e IGNORE1 -e IGNORE2 -e IGNORE3 ... |  
xargs -I {} sh -c '{ chmod g+w {}; chgrp mygroup {};}'

【讨论】:

    猜你喜欢
    • 2011-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多