我想按文件名长度查找所有文件。
例如如果我想查找长度为1的文件,例如a.go
,b.go
.
我放:
grep '.\{1\}' file
但这是行不通的。我可以使用什么命令来按文件名长度查找文件?
答案1
如果您只想查找文件名,可以使用以下命令:
find -exec basename '{}' ';' | egrep '^.{100,}$'
这将运行find
,使用提取文件或目录的名称basename
,然后查找至少 100 个字符的任何文件名或目录名。如果您想查找精确长度的文件名,请{100}
使用{100,}
.
如果您想查找包含路径的文件名,请执行以下操作:
find | egrep '/[^/]{100,}$'
这将返回文件名,包括运行 find 命令的相对路径。
答案2
grep
查找文件内容中的模式。如果您想查看名字对于这些文件,您可以只使用 shell glob(如果您只想考虑当前目录中的文件名):
echo ?.go
(顺便说一下,是 shell 计算 glob,而不是命令echo
。)
如果您想从当前目录开始递归地查找目录,则要使用的工具是find
:
find . -name '?.go'
(请注意,您必须引用该模式,以防止 shell 在调用之前将其作为 glob 进行评估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}\.[^.]+$'
注意:上面的解决方案假设您有相对健全的文件名,不包含换行符等。在计算长度时,它也会计算而不忽略文件名中的空格,这可能不是您想要的。如果其中任何一个有问题,请告诉我,我会更新我的答案。
答案4
您不指定,但如果文件位于目录结构内,您可以使用以下命令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