按文件名长度查找文件


10

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

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

我放:

grep '.\{1\}' file

但这是行不通的。我可以使用什么命令按文件名长度查找文件?


a.go是长度为4 a的文件名。是长度为1的文件名。这是Unix,而不是DOS,其名称和扩展名是分开的,并且隐式.始终是文件名的一部分。
彼得·科德斯

Answers:


3

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

echo ?.go

(顺便说一句,是外壳评估了glob,而不是echo命令。)

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

find . -name '?.go'

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


1
这还将找到也与模式“?.go”匹配的目录。
slm

@slm,目录是许多文件类型之一,OP没有指定他要处理的文件类型。
斯特凡Chazelas

8

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

find -exec basename '{}' ';' | egrep '^.{100,}$'

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

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

find | egrep '/[^/]{100,}$'

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


3

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

$ tree
.
├── a
├── ab
├── abc
├── abcd
└── dir
    ├── a
    ├── ab
    ├── abc
    └── abcd

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

$ find . -type f | sort
./a
./ab
./abc
./abcd
./dir/a
./dir/ab
./dir/abc
./dir/abcd

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

 $ find . -type f | grep -P '/.{3}$'

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

您也可以简单地这样做:

find . -type f | grep -P '/...$'

这对于键入15个点以匹配长度为15的文件名的较小数字来说不是很有效。

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

find . -type f | grep -P '/.{1}\.'

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

find . -type f | grep -P '/.{1}\.[^.]+$'

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


1

您无需指定,但是如果文件在目录结构中,则可以使用以下命令find来查找长度为1的文件grep

$ find . -type f  | grep -P '/.{1}\.'

$ find . -type f  | grep -P '/.{1}\.' | head -10
./util-linux-2.19/include/c.h
./88366/a.bash
./89186/a.bash
./89563/b.txt
./89563/a.txt
./89563/c.txt
./89563/d.txt
./91734/2.c
./91734/4.c
./91734/1.c

在MacOS X上,使用egrep并删除-P选项
Bart Kummel

@BartKummel-实际上在OSX上我使用ggrepheystephenwood.com/2013/09/install-gnu-grep-on-mac-osx.html。还应意识到该Q没有被标记为OSX,因此使用grep是恰当的。
slm

1

我会用这样的东西。

find . -type f -name "?.go"

因此,如果您输入两个“?” 那么您正在寻找带有两个字符和扩展名的文件名。


0

当您想在find命令中使用正则表达式时,应使用""例如:

find /var/log -iname "*.err" 

用于您的情况:

find yourpath -type f -a -name "?.go"

您应该用yourpath替换实际路径,-aAnd -type f意味着您只在寻找常规文件。

? 在您的查询中,如果您回想起,则表示一个字符,例如DOS。


-1

ls ?.* 应该给您想要的结果。


欢迎使用Unix.SE。不幸的是,向已经有很多好的答案的旧问题添加答案是没有用的。(除非有解决旧问题的新的更好方法,或者比任何旧答案有更好的解决方案。)如果要回答某些问题,请在首页上查看新问题。
彼得·科德斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.