如何使用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 {} \;
提前致谢:)
答案 0 :(得分:3)
如果您在第一个示例中显示的代码是真实代码,则不需要完整的正则表达式,标准find
支持的通配符模式就足够了。
find / -type f \( -perm +111 -name "*[0-9]" -o -name "*[mh]" \) -exec ls -lT {} \;
请注意,此命令会查找名称以数字结尾的可执行文件,以及具有名称以m
或h
结尾的任何权限的文件。如果您的意思是无论名称如何都应用,-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/./\\&/