如何在目录中搜索以“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 

特别是在大文件夹中非常有用。