gpt4 book ai didi

linux - 如何为GNU find适本地限定-or运算符?如何找到指向可执行文件的符号链接(symbolic link)?

转载 作者:太空狗 更新时间:2023-10-29 11:25:48 25 4
gpt4 key购买 nike

我在我的shell脚本中制作了一个函数,如下所示:

getcmds()
{
# find all executable files/symlinks in $(searchdirs) that start with 'upvoter-'
searchdirs | xargs -i find {} -name 'upvoter-*' -type f -or -type l -maxdepth 1 -perm +111
}

当我从脚本的另一个位置运行此函数时,我得到了一堆输出,它们的输出不是而不是,而是以 upvoter-开头。我最终将其范围缩小到 正在解释我的查询这样的事实:

find everything that's a file and starts with upvoter-, OR is an executable symlink at the top-level directory



我查看了 find man page,试图找到解决我问题的方法。我注意到 find支持括号,所以我尝试了一下:
find {} -name 'upvoter-*' -type f -or \( -type l \) -maxdepth 1 -perm +111

和这个:
find {} -name 'upvoter-*' \( -type f -or -type l \) -maxdepth 1 -perm +111

不幸的是,他们俩都没有工作。我该怎么做才能解决此问题?

谢谢。

最佳答案

为了补充Jonathan Leffler's helpful answer和@muru的helfpul评论:

  • 您问题中的最后一个命令命令应按照的优先级运行:
  • find隐式组合了诸如-type之类的测试以及诸如-print之类的 Action 与-and(逻辑与;与POSIX兼容的形式为-a)。
  • 相比之下,-maxdepth是一个选项,它不是位置性的,并且始终应用于整个命令。
  • 有关find术语和概念的概述,请参阅我的this answer
  • 您的上一个解决方案尝试正确地使用括号来更改隐含的评估优先级以实现所需的逻辑(-or的优先级低于-and的优先级)。
  • 相比之下,第一次解决方案尝试中的括号-or \( -type l \)根本不影响优先级,因为它们仅包含一个测试(而定义优先级仅对多个操作数有效)。
  • 注意()如何被引为\(\),以防止它们被 shell 解释; '('')'也可以使用。
  • 但是,-perm测试的可能并没有按照的要求进行操作:按照书面形式,它会测试自身的符号链接(symbolic link)是否可执行,而不是其目标。鉴于符号链接(symbolic link)始终被标记为可执行文件,无论它们的目标是否存在,您最终都将匹配任何符号链接(symbolic link),即使它没有引用可执行文件也是如此。
  • 要解决此问题,使用-L选项,这使find将诸如-perm之类的测试应用于符号链接(symbolic link)的目标。
  • 请注意,这是有副作用的:-L时,当find遇到指向目录的符号链接(symbolic link)时,它会下降到该目录中(即,它也处理符号链接(symbolic link)的目标目录),默认情况下不会发生。

  • 考虑到以上几点,具有讽刺意味的是,完全不需要括号了,因为 \( -type f -or -type l \)可以替换为 -type f,因为 -L现在可以确保测试符号链接(symbolic link)目标的类型:

    注意:
    -我从以下命令中删除了 {},仅关注 find命令。没有文件名参数,GNU find在当前目录上隐式操作(暗含 .);相比之下,BSD find需要一个filename参数。
    -另外, /111而不是 +111用作权限掩码,因为 +语法在不久之前已被弃用,并且实际上已在GNU find 4.5.12中删除。
    -最后,将 -maxdepth 1放置在第一个位置元素(测试 -name)之前,不仅可以提高概念的清晰度(如 -maxdepth所述,因为它是一个选项,始终适用于整个命令),而且还禁止显示关于否则会发出GNU find
    find -L -maxdepth 1 -name 'upvoter-*' -type f -perm /111

    有关命令的其他想法:
  • -perm /111(-perm +111)应用任何指定的位设置逻辑,即,它测试是否为任何安全主体设置了可执行位;等效的符号模式是-perm /a=x
  • 如前所述,+语法不久前已被弃用,并已在GNU find v4.5.12中删除。
  • 相比之下,
  • BSD find继续仅支持+,不幸的是,这意味着使用GNU find 4.5.12或更高版本的两种实现都无法使用具有此功能的单个命令。
  • 无论如何,此功能是非标准的(不兼容POSIX)。
  • 如果您只想匹配设置了所有执行位的文件,请使用前缀-:-perm -111-perm -a=x
  • 另外,如果您想测试文件是否可执行,请使用-executable测试(GNU find扩展名)。
  • 而且,-executable“考虑了-perm测试忽略的访问控制列表和其他权限伪像。” (来自man find)。

  • 最后,不建议使用GNU xargs-i选项;该手册建议改为使用 -I {}

    关于linux - 如何为GNU find适本地限定-or运算符?如何找到指向可执行文件的符号链接(symbolic link)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35519890/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com