Solaris 10下筛选不含小写字符的文件列表的技术求助
在Solaris 10中筛选不含小写字符的文件
针对你在Solaris 10下遇到的问题——从find生成的文件列表里排除名称包含小写字符的文件,我整理了两种适配Solaris工具特性的可行方案,分别用find直接处理和配合awk来实现:
方案一:直接用find命令筛选
Solaris 10的find默认不支持GNU风格的扩展正则,但可以结合-exec调用shell命令来检查文件名是否全为大写:
find . -type f -exec sh -c ' fname=$(basename "$1") echo "$fname" | grep -q "^[A-Z0-9.]*$" ' sh {} \; -print
关键细节说明:
-exec sh -c '...' sh {} \;:对每个找到的文件,启动一个shell子进程处理basename "$1":提取纯文件名(去掉前面的路径部分)grep -q "^[A-Z0-9.]*$":静默检查文件名是否仅包含大写字母、数字和点号;如果你的文件名还有其他合法字符(比如下划线_),直接把它加到括号里即可- 只有通过检查的文件才会被
-print输出
如果偏好正则匹配,也可以用Solaris find的-regex选项(注意它匹配的是完整文件路径,而非仅文件名):
find . -type f -regex ".*/[A-Z0-9.]*$" -print
这个正则表示路径的最后一段(文件名)只能包含大写字母、数字和点号,前面的路径部分可以是任意内容。
方案二:通过awk处理find的输出
如果你已经用find生成了文件列表,想通过管道交给awk处理,推荐使用Solaris的POSIX兼容awk(/usr/xpg4/bin/awk,避免旧版awk的兼容性问题):
处理每行一个路径的输出(find默认输出格式)
find . -type f | /usr/xpg4/bin/awk ' { # 提取文件名:去掉最后一个/之前的所有内容 fname = $0 sub(/.*\//, "", fname) } # 仅输出文件名不含小写字母的行 fname !~ /[a-z]/ '
处理空格分隔的单行列表(你给出的示例输入格式)
如果你的find输出是像FOO/BAR.TXT FOO/bar.TXT ...这样的空格分隔单行列表,可以调整awk逻辑逐个检查:
# 假设输入是空格分隔的文件路径列表 echo "FOO/BAR.TXT FOO/bar.TXT FOO/BAT.TXT BAZ/BAR.TXT BAZ/baz.TXT" | /usr/xpg4/bin/awk ' { for (i=1; i<=NF; i++) { fname = $i sub(/.*\//, "", fname) if (fname !~ /[a-z]/) { printf "%s ", $i } } print "" } '
方案二说明:
sub(/.*\//, "", fname):把文件名部分从完整路径中剥离出来fname !~ /[a-z]/:判断文件名是否不包含任何小写字母,满足条件则输出原路径
内容的提问来源于stack exchange,提问作者JimR
相关产品推荐
相关产品推荐

