选择文件夹

时间:2017-12-06 13:27:11

标签: linux shell

我想在目录中的文件列表中选择特定的文件格式。请找到以下示例。

我有一个下面的文件列表(6个文件)。

SET-1
1)MAG_L_NT_AA_SUM_2017_01_20.dat
2)MAG_L_NT_AA_2017_01_20.dat

SET-2
1)MAG_L_NT_BB_SUM_2017_01_20.dat
2)MAG_L_NT_BB_2017_01_20.dat

设置-3
1)MAG_L_NT_CC_SUM_2017_01_20.dat
2)MAG_L_NT_CC_2017_01_20.dat

从以上三组我只需要3个文件 1)MAG_L_NT_AA_2017_01_20.dat
2)MAG_L_NT_BB_2017_01_20.dat
3)MAG_L_NT_CC_2017_01_20.dat

注意:可以有多行命令,因为我已经为上面的req创建了脚本。感谢

1 个答案:

答案 0 :(得分:0)

问题的最简单和最简单的解决方案是find用于搜索目录层次结构中的文件的工具)和grep工具打印与图案匹配的行)。您还可以通过键入man findman grep来阅读这些工具手册。

在直接寻求解决方案之前,我们需要了解我们将如何处理您的问题。要在我们搜索的文件名中查找模式,我们将使用带有选项find的{​​{1}}命令:

  

-name 模式

     

文件名的基础(删除了前导目录的路径)与shell模式模式匹配。元字符(' *','?'和' []')   匹配'。'在基本名称的开头(这是一个改变   的findutils-4.2.2;见下面的标准一致性部分)。忽略一个   目录及其下的文件,使用-prune;看到一个例子   -path的描述。大括号不被认为是特殊的,   尽管包括Bash在内的一些贝壳带有一个支撑物   贝壳图案的特殊含义。执行文件名匹配   使用fnmatch(3)库函数。别忘了   将模式用引号括起来,以防止它被扩展   贝壳。

例如,如果我们要搜索包含字符串' abc'的文件。在名为-name的目录中,我们将输入以下内容:

'words_directory'

如果我们想搜索目录中的所有目录:

$ find words_directory -name "*abc*"

首先,我们需要查找所有文件,其中开始包含字符串$ find words_directory/* -name "*abc*" 并以"MAG_L_NT_"结尾,因此要查找".dat"中所有匹配的名称其中包含许多子目录,其中可能包含与此模式匹配的文件:

/your/specified/path/

然而,这会打印所有找到的文件名,但我们仍然会得到包含$ find /your/specified/path/* -name "MAG_L_NT_*.dat" 字符串的名称,其中包含grep。要排除包含不需要的字符串的名称,我们将使用选项"SUM"

  

-v - 反转匹配

     

反转匹配感,选择不匹配的线条。 (-v是   由POSIX指定。)

要使用grep过滤掉第一个命令输出,我们将使用pipe()-v

  

管道的标准shell语法是列出多个命令,   用竖线分隔("管道"在普通的Unix中的措辞)。对于   例如,要列出当前目录(ls)中的文件,只保留   ls输出行,包含字符串" key" (grep),并查看   导致滚动页面(更少),用户键入以下内容   终端的命令行:

|
     

" ls -l"生成一个进程,其输出(stdout)通过管道输出   " grep key"的过程的输入(stdin);同样的   " less"的过程。每个过程都从前一个过程中获取输入   并通过标准流为下一个流程生成输出。每   " |"告诉shell连接命令的标准输出   左侧为命令的标准输入,右侧为   进程间通信机制称为(匿名)管道,   在操作系统中实现。管道是单向的;数据   从左到右流过管道。

ls -l | grep key | less

在您熟悉所提及的用于实现目标的命令和选项之后,您已准备好解决方案:

 process1 | process2 | process3

此命令将生成所有以$ find /your/specified/path/* -name "MAG_L_NT_*.dat" | grep -v "SUM" 开头并以" .dat"结尾的名称的输出。 "MAG_L_NT_"将使用第一个命令输出作为输入,并删除包含grep -v字符串的所有行。