查找不包含小写

时间:2018-04-02 19:34:35

标签: awk find solaris

尝试了几十次迭代,但似乎找不到合适的组合。我使用find来创建子目录和文件列表。我想省略任何包含小写字符的文件名。我将输出管道输出到awk进行进一步处理,所以如果它更容易,那就没问题了。我已经尝试了find和awk(单独)。我在Solaris 10 Unix上,如果这有任何区别。

输入文件列表:

FOO/BAR.TXT
FOO/bar.TXT
FOO/BAT.TXT
BAZ/BAR.TXT
BAZ/baz.TXT

期望的输出

FOO/BAR.TXT
FOO/BAT.TXT
BAZ/BAR.TXT

我的查找包含其他排除项,仅举例说明

find ! \( -name 'FRED*' -o \
      -name '*JONES' -o \
      -name '*[a-z]8'  \) 

我也尝试将小写否定移到nawk发现中,例如:

find ! \( -name 'FRED*' -o \
      -name '*JONES'  \) 
    | nawk  -F'/' '!/a-z/ {print $2}'

我尝试的每次迭代都没有输出,或者所有输出都包含带小写字符的文件名。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

让我们考虑一下这些文件的目录:

$ find . -type f
./FOO/BAT.TXT
./FOO/bar.TXT
./FOO/BAR.TXT
./BAZ/BAR.TXT
./BAZ/baz.TXT

要排除名称中包含一个或多个小写字符的所有文件:

$ find . -regextype egrep -type f -regex '[^[:lower:]]*'
./FOO/BAT.TXT
./FOO/BAR.TXT
./BAZ/BAR.TXT

注意:

  1. [:lower:]是匹配任何小写字符的POSIX正则表达式。 这是unicode安全的。 [^[:lower:]]匹配除小写字母以外的任何字符。 [^[:lower:]]*匹配任何不包含小写字符的字符序列。

  2. 查找-regex将此正则表达式应用于整个路径并坚持它从头到尾匹配,就好像它是^[^[:lower:]]*$一样。

  3. Find支持各种各样的正则表达式样式。我选择了egrep样式,其中包括通常的POSIX扩展正则表达式。