我正在搜索大量文件,试图找到包含 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