如何在目录中搜索以“ABC”开头的所有文件?
我需要搜索以某个特定名称开头的文件。 可以有多个以特定模式开头的文件,我想列出目录中存在的所有这些文件。
要完成现有答案:
ls
默认目录列表实用程序ls
可以与shell的通配符结合使用。 要搜索带有模式abc
所有文件:
ls abc* # list all files starting with abc--- ls *abc* # list all files containing --abc-- ls *abc # list all files ending with --abc
请注意,文件扩展名也与搜索结果相关。
tree
如果我们需要在目录树中列出文件,我们也可以发出tree
来搜索给定的模式,如:
tree -P 'abc*' # list directory tree of file starting with abc--- tree -l 'def*' # exclude files starting with def---
在这种情况下, tree
本身支持通配符。
您可以使用find
命令搜索带有模式的文件
find . -type f -name "abc*"
上面的命令将搜索当前工作目录下以abc开头的文件。
-name 'abc'
将列出完全匹配的文件。 例如:abc
你也可以使用
-iname -regex
使用find
命令选项以使用模式搜索文件名
有很多方法可以做到这一点,具体取决于你想要用它们做什么。 通常,如果您只想列出它们,可以使用以下命令在终端中执行:
find | grep '^\./ABC'
…并用你的文字取代ABC
。
要理解命令,让我们分解一下:
-
find
列出当前目录及其子目录下的所有文件; 单独使用它只会列出那里的一切。 请注意,find
输出以./
开头的每个文件或目录,表示它们的路径相对于当前目录。 意识到这一点很重要,因为这意味着我们将搜索以./ABC
而不仅仅是ABC
。 -
管道特征
|
将一个命令的输出重定向到另一个命令,在这种情况下,find
的输出被重定向到grep
。 这称为管道。 -
grep
获取输出并使用给定模式过滤它,^\./ABC
。- 请注意,模式引用单引号
' '
以防止shell解释其中的特殊字符。
- 请注意,模式引用单引号
-
现在,模式本身是用一种称为正则表达式的特殊语法编写的,或简称为regex 。 Regex是一个非常强大的搜索工具,如果你掌握它,并且有这样的网站可以更深入地教你,但请注意
grep
不是一个成熟的正则表达式引擎,你不能用它做任何事情。 -
为了我们的目的:
-
正则表达式中的
^
匹配字符串的开头; 这可以防止它匹配模式,如果它不发生在文件名的开头。 -
.
在正则表达式中也有一个特殊含义:它意味着“匹配任何单个字符”。 如果你想将它用作文字点,你必须在它之前使用反斜杠\
“逃避”它。 (是的,匹配任何角色在我们的情况下都是无害的,但我是为了完整性而做的。)
-
你可以使用GREP,我认为这是最简单的解决方案,可能还添加一些其他grep参数,以使匹配更准确
tree | grep ABC
您可以使用Nautilus文件管理器和正则表达式搜索特定模式。
为此,请单击Gear菜单中的Select Items Matching ,如下所示(您也可以按Ctrl + s )。
然后,只需键入正则表达式 ABC*
并validation。
将自动选择名称与您的模式匹配的每个文件。
我在Ubuntu 12.10( Quantal)上使用GNOME3 PPA的Nautilus 3.6。*。
我用
ls | grep abc
要么
ls -la | grep abc
它显示所有带有abc的文件,而不仅仅是以abc开头。 但是,这对我来说是一个非常简单的方法。
对我来说最简单的解决方案
ls | grep PATTERN
在这里,您可以在PATTERN中提供任何正则表达式。
例如,要查找名称中包含“ab”的文件,请键入
ls | grep ".*ab.*"
要查找以“ab”开头的文件,请键入
ls | grep "^ab"
python:
$ python -c 'import sys,os;found=[os.path.join(r,i) for r,s,f in os.walk(".") for i in f if i.startswith("ABC")];map(lambda x: sys.stdout.write(x+"\n") ,found)'
Perl的:
$ perl -le 'use File::Find;find(sub{ -f && $_ =~/^ABC/ && print $File::Find::name },".")'
printf "%s" /path/to/files/ABC*
这是全局模式匹配,它锚定在两端。 这将匹配以“ABC”开头的所有文件,例如“ABC”,“ABC.txt”,“ABC123”,但不匹配“xABC”。 从命令行使用’ls’代替’printf’这里是一个安全的选择,但是,根据你的意见你同意,’ls’在脚本中使用是不安全的。 在这种情况下,使用带有glob模式匹配的’printf’被认为是安全的。 如果要在脚本中使用它,’printf’的输出将不包含新行字符,直到输出流结束为止:
printf "%s" /path/to/files/ABC*
返回:
/path/to/files/ABC /path/to/files/ABC123
如果在每个实例后需要换行符:
printf "%s\n" /path/to/files/ABC*
返回:
/path/to/files/ABC /path/to/files/ABC123
如果在运行’printf’命令时以这种方式输入,则“/ path / to / files /”将保留在输出中。 没有它,只显示文件名:
printf "%s" ABC*
返回
ABC ABC123
假设您在文件所在的目录中运行该命令。
在我最喜欢的vim插件之一的Command-t中,它是基于ruby的插件,与上面的FZF集成。
通过使用Comamnd-T和FZF,您可以使用极快的“模糊”机制进行搜索:
- 打开文件和缓冲区
- 跳转到标签和帮助
- 运行命令或以前的搜索和命令
- 用最少的击键次数。
如你看到的
我总是通过打开一个新终端搜索命令历史记录并点击:
CTRL+R
除了通过在任何终端选项卡中写入来递归搜索所有文件夹:
fzf
然后开始您的文件名
ABC
另外,你可以在vim
里面写
:CommandT
特别是在大文件夹中非常有用。