我想在目录中的文件列表中选择特定的文件格式。请找到以下示例。
我有一个下面的文件列表(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创建了脚本。感谢
答案 0 :(得分:0)
问题的最简单和最简单的解决方案是find(用于搜索目录层次结构中的文件的工具)和grep(工具打印与图案匹配的行)。您还可以通过键入man find
和man 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
字符串的所有行。