【问题标题】:How to find files in Solaris using multiple regular expressions如何使用多个正则表达式在 Solaris 中查找文件
【发布时间】:2016-09-03 21:42:38
【问题描述】:

如何使用find 或任何其他命令在 Solaris 上使用正则表达式查找文件。
我已经设法在 Mac OSX 和 Ubuntu 中做到了,但似乎 Solaris 不支持 -regex 标志。

Mac OSX 中的示例:

find / -type f \( -perm +111 -regex ".*[0-9]$" -o -regex ".*[mh]$" \) -exec ls -lT {} \;

Ubuntu 中的示例:

sudo find / -type f \( -executable -regex ".*[0-9]$" -o -regex ".*[mh]$" \) -print0 -exec ls -l --time-style=long-iso {} \;

我需要在 Solaris 中同时查找与一个或多个正则表达式匹配的所有文件。

更具体地说,有两个文件被复制到 Solaris 机器上: 1.脚本.sh 2. 模式

脚本逐行读取模式文件,并从模式文件中的所有正则表达式模式中创建一个单行查找命令,并立即执行以列出与正则表达式模式匹配的所有文件。

模式文件示例:

\/usr[a-zA-Z0-9_.\/]+msg_\d+.txt
\/home[\S]+\.txt
.*[0-9]

用于上述示例的脚本:

find / -type f \( -perm +111 -regex "\/usr[a-zA-Z0-9_.\/]+msg_\d+.txt" -o -regex "\/home[\S]+\.txt" -o -regex ".*[0-9]" \) -exec ls -lT {} \;

提前致谢:)

【问题讨论】:

    标签: linux bash unix solaris


    【解决方案1】:

    如果您在第一个示例中显示的代码是您的真实代码,则不需要完整的正则表达式,标准 find 支持的通配符模式就足够了。

    find / -type f \( -perm +111 -name "*[0-9]" -o -name "*[mh]" \) -exec ls -lT {} \;
    

    请注意,此命令查找名称以数字结尾的可执行文件,以及名称以mh 结尾的具有任何权限的文件。如果您的意思是无论名称如何都应用权限,则-perm 条件必须在括号之外。

    您可以在 Solaris 上安装 GNU find。它甚至可能已经以gfind 的形式提供。它在findutils package

    如果您需要坚持最小安装并且需要完整的正则表达式而不仅仅是通配符模式,您可以运行 ksh 进行一些额外的过滤。使用通配符模式匹配您想要的所有文件名等等,然后使用 ksh93 和 =~ 条件运算符来优化匹配。

    find … -exec ksh -c 'for x do [[ $x =~ REGEX ]] || continue; ls -lT "$0"; done' _ {} +
    

    请注意,这些使用扩展正则表达式语法 (ERE),而不是 find -regex 使用的基本正则表达式语法 (BRE)。您可以通过在-regex 之前传递-regextype posix-extended 使GNU find 使用ERE。

    或者,如果您没有使用find 的全部功能(很少需要),请使用 ksh 的递归通配符来匹配文件,并使用条件来过滤权限和文件类型。即使语法不同,Ksh 的 glob(@(…|…)*(…) 等)也具有与正则表达式相同的功能。

    set -o globstar
    for x in **/*; do
      [[ -f $x && -x $x ]] || continue
      ls -lT -- "$x"
    done
    

    【讨论】:

    • 谢谢,但我需要支持通配符模式以及复杂的正则表达式,例如:\/usr[a-zA-Z0-9_.\/]+msg_\d+.txt
    • @mor222 然后你需要使用我提出的解决方案之一(调用 GNU find,或者做额外的过滤,或者使用递归通配符)。
    • 第二个-regex也需要更换; -name '*[mh]'
    【解决方案2】:

    如果可以假定没有文件名包含换行符,则输出 的find 可以通过另一个实用程序过滤,在这种情况下为sed

    find / -type f -perm +111 | sed '/^.*[0-9]$/n;/^.*[mh]$/n;d' |
        sed 's/./\\&/' | xargs ls -lT
    

    sed 的第一次使用在任一正则表达式匹配时打印一行,第二次使用 xargs 转义字符以确保该行 从字面上解释到换行符。

    sed 的使用可以组合成一个多行脚本:

    /^.*[0-9]$/bp
    /^.*[mh]$/bp
    d
    :p
    s/./\\&/
    

    【讨论】:

      猜你喜欢
      • 2023-01-28
      • 2012-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多