You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:43:29