按文件名长度查找文件

EPS*_*dsf 16 command-line find filenames

我想按文件名的长度查找所有文件。

例如,如果我想查找长度为 1 的文件,例如a.go, b.go.

我放:

grep '.\{1\}' file
Run Code Online (Sandbox Code Playgroud)

但这不起作用。我可以使用什么命令按文件名长度查找文件?

小智 14

如果只想查找文件名,可以使用以下命令:

find -exec basename '{}' ';' | egrep '^.{100,}$'
Run Code Online (Sandbox Code Playgroud)

这将运行find,使用提取basename文件或目录的名称,然后查找任何至少 100 个字符的文件名或目录名称。如果要查找精确长度的文件名,请使用{100}代替{100,}

如果要查找包含路径的文件名,请执行以下操作:

find | egrep '/[^/]{100,}$'
Run Code Online (Sandbox Code Playgroud)

这将返回文件名,包括您运行 find 命令的位置的相对路径。


200*_*ess 6

grep查找文件内容中的模式。如果你想查看文件的名称,你可以使用 shell glob(如果你只想考虑当前目录中的文件名):

echo ?.go
Run Code Online (Sandbox Code Playgroud)

(顺便说一下,是 shell 计算 glob,而不是命令echo。)

如果您想从当前目录开始递归地查找目录,则要使用的工具是find

find . -name '?.go'
Run Code Online (Sandbox Code Playgroud)

(请注意,您必须引用该模式,以防止 shell 在find调用之前将其作为 glob 进行评估。)


ter*_*don 5

首先,grep搜索文件内容,它不会搜索文件名。为了你想要的find。它没有设置文件名长度的选项,但您可以解析它的输出以获得您想要的内容。以下是我在包含以下文件的目录中运行的一些示例:

\n\n
$ tree\n.\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 a\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 ab\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 abc\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 abcd\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 dir\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 a\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 ab\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 abc\n    \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 abcd\n
Run Code Online (Sandbox Code Playgroud)\n\n

在此目录中搜索文件将返回:

\n\n
$ find . -type f | sort\n./a\n./ab\n./abc\n./abcd\n./dir/a\n./dir/ab\n./dir/abc\n./dir/abcd\n
Run Code Online (Sandbox Code Playgroud)\n\n

因此,要查找长度为 X 的文件,我们需要删除路径并仅匹配最后一个之后的字符/

\n\n
 $ find . -type f | grep -P \'/.{3}$\'\n
Run Code Online (Sandbox Code Playgroud)\n\n

sed命令只是删除./. 该标志激活 Perl 兼容正则表达式,这是 PCRE 所-P需要的,其含义是“匹配字符串的末尾”。{n}$

\n\n

你也可以简单地这样做:

\n\n
find . -type f | grep -P \'/...$\'\n
Run Code Online (Sandbox Code Playgroud)\n\n

对于小数字来说这很好,输入 15 个点来匹配长度为 15 的文件名,但效率不高。

\n\n

最后,如果您想忽略扩展名并仅匹配文件名,请执行以下操作(如 @slm 建议):

\n\n
find . -type f | grep -P \'/.{1}\\.\'\n
Run Code Online (Sandbox Code Playgroud)\n\n

但是,这也会找到类似a.bo.go. 如果您的文件名可以包含多个.

\n\n
find . -type f | grep -P \'/.{1}\\.[^.]+$\'\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n\n

注意:上面的解决方案假设您有相对健全的文件名,不包含换行符等。在计算长度时,它也会计算而不忽略文件名中的空格,这可能不是您想要的。如果其中任何一个有问题,请告诉我,我将更新我的答案。

\n