搜索仅包含特定长度字符串的所有文件

搜索仅包含特定长度字符串的所有文件

我正在搜索大量文件,试图找到包含 8 个字符的字符串的文件 - 没有其他文件。

到目前为止我已经尝试过:-

grep -x '.\{8,8\}'

它向我显示了包含恰好 8 个字符的字符串的文件,但也显示了包含许多其他内容以及 8 个字符的文件。我想要包含正好 8 个字符的字符串的文件,仅此而已。

任何帮助将非常感激。谢谢。

答案1

您正在查找长度为 9 个字节、八个字符和一个换行符的文件。这假设您仅查找单字节字符。

find . -type f -size 9c -exec grep -l -E '^.{8}$' {} +

这会查找当前目录中或当前目录下长度恰好为 9 个字节的所有常规文件。为了验证它们只包含一行,我们遍历grep它们并尝试匹配恰好包含八个字符的行。我们使用grep其选项输出匹配文件的名称-l

答案2

使用 GNUawk查找仅包含一行、恰好包含 8 个字符的常规文件(不包括换行符,如果有的话):

find . -type f -size +7c -size -50c -exec gawk '
  BEGINFILE               {p = 0}
  FNR == 1 && length == 8 {p = 1}
  FNR == 2                {p = 0; nextfile}
  ENDFILE                 {if (p) print FILENAME}' {} +

使用 find,我们限制大小在 8 到 49 字节之间的文件。 8 表示具有 8 个一字节字符且无换行符的文件,49 表示 8 个 6 字节字符(UTF-8 中的最大值,您可能需要适应其他字符集)和换行符。

或者与zsh

has_one_line_of_8_characters() {
  local c
  ! read -ru0 -k10 c && [[ $c =~ $'^[^\n]{8}\n?$' ]]
} < ${1-$REPLY}

printf '%s\n' **/*(.DL+7L-50+has_one_line_of_8_characters)

答案3

gawk '/^.{9}$/{print FILENAME}' RS='\0' *

我选择了9个字符,因为8个字符加上行尾的换行符总共=9个字符。如果您严格需要 8 个字符(包括换行符),则应在模式中使用 8 个数字。

测试

我的测试文件夹中有四个文件:

$ tail -n +1 -- *
==> 11_chars <==
zzzzzzzzzz

==> 5_chars <==
zzzz

==> 7_chars <==
zzzzzz

==> 9_chars <==
zzzzzzzz

输出

$ gawk '/^.{9}$/{print FILENAME}' RS='\0' *
9_chars

相关内容