我想按文件名的长度查找所有文件。
例如,如果我想找到长度为1的文件,如a.go
,b.go
。
我放:
grep '.\{1\}' file
但这是行不通的。我可以使用什么命令按文件名长度查找文件?
我想按文件名的长度查找所有文件。
例如,如果我想找到长度为1的文件,如a.go
,b.go
。
我放:
grep '.\{1\}' file
但这是行不通的。我可以使用什么命令按文件名长度查找文件?
Answers:
grep
在文件内容中查找模式。如果要查看文件名,则可以使用shell glob(如果仅考虑当前目录中的文件名):
echo ?.go
(顺便说一句,是外壳评估了glob,而不是echo
命令。)
如果要递归查找目录,从当前目录开始,使用的工具是find
:
find . -name '?.go'
(请注意,您必须引用该模式以防止外壳在find
调用之前将其评估为glob 。)
首先,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}\.[^.]+$'
注意:上面的解决方案假定您具有相对合理的文件名,其中不包含换行符等。在计算可能不是您想要的长度时,它也将不忽略文件名中的空格。如果上述任何一个有问题,请告诉我,我将更新答案。
您无需指定,但是如果文件在目录结构中,则可以使用以下命令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
ggrep
:heystephenwood.com/2013/09/install-gnu-grep-on-mac-osx.html。还应意识到该Q没有被标记为OSX,因此使用grep
是恰当的。
我会用这样的东西。
find . -type f -name "?.go"
因此,如果您输入两个“?” 那么您正在寻找带有两个字符和扩展名的文件名。
ls ?.*
应该给您想要的结果。
a.go
是长度为4a
的文件名。是长度为1的文件名。这是Unix,而不是DOS,其名称和扩展名是分开的,并且隐式.
始终是文件名的一部分。