【问题标题】:Find list of files that do not contain lower-case查找不包含小写的文件列表
【发布时间】:2018-04-02 19:34:34
【问题描述】:

尝试了几十次迭代,但似乎找不到合适的组合。我正在使用 find 创建子目录和文件的列表。我想省略任何包含小写字符的文件名。我将输出通过管道传输到 awk 以进行进一步处理,所以如果那里更容易,那很好。我已经尝试过 find 和 awk find (分别)。如果这有什么不同的话,我在 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}'

我尝试过的每次迭代要么没有输出,要么所有输出包括带有小写字符的文件名。

非常感谢任何帮助。

【问题讨论】:

  • 如果目录名包含小写字母但文件名不包含会发生什么,例如foo/BAR.TXT? awk 中的字符范围写为[a-z],就像您在find 中使用的一样,顺便说一句。此外,请考虑切换到 /usr/xpg4/bin/awk 而不是 nawk,因为 nawk 非常古老并且是 POSIX 之前的(这就是为什么您需要使用 [a-z] 而不是 [[:lower:]])而 /usr/xpg4/bin/ awk 更现代,[几乎] POSIX。
  • find . | grep -v \[a-z\]
  • 不排除-name '*[a-z]8',试试-name '*[a-z]*'

标签: awk find solaris


【解决方案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. Find 的 -regex 将此正则表达式应用于整个路径,并坚持从头到尾匹配,就好像它是 ^[^[:lower:]]*$

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-07
    • 2018-02-28
    • 2019-12-18
    相关资源
    最近更新 更多