如何使用多个正则表达式在Solaris中查找文件

时间:2016-09-03 21:42:38

标签: linux bash unix solaris

如何使用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机器: script.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 {} \;

提前致谢:)

2 个答案:

答案 0 :(得分:3)

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

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

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

您可以在Solaris上安装GNU find。它甚至可能已作为gfind提供。它位于findutils package

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

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

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

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

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

答案 1 :(得分: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/./\\&/