Linux 选择文件夹中的特定文件
我想从目录中的文件列表中选择文件的特定格式。请找到下面的例子 我有下面的文件列表(6个文件) Set-1Linux 选择文件夹中的特定文件,linux,shell,Linux,Shell,我想从目录中的文件列表中选择文件的特定格式。请找到下面的例子 我有下面的文件列表(6个文件) Set-1 1) 2017年1月20日新台币金额数据 2) MAG_L_NT_AA_2017_01_20.dat Set-2 1) 2017年第1季度第20季度的数据 2) MAG_L_NT_BB_2017_01_20.dat Set-3 1) MAG_L_NT_CC_SUM_2017_01_20.日期 2) MAG_L_NT_CC_2017_01_20.dat 从以上三组中,我只需要3个文件。 1)
1) 2017年1月20日新台币金额数据
2) MAG_L_NT_AA_2017_01_20.dat Set-2
1) 2017年第1季度第20季度的数据
2) MAG_L_NT_BB_2017_01_20.dat Set-3
1) MAG_L_NT_CC_SUM_2017_01_20.日期
2) MAG_L_NT_CC_2017_01_20.dat 从以上三组中,我只需要3个文件。
1) 2017年1月20日星期日 2) MAG_L_NT_BB_2017_01_20.dat
3) MAG_L_NT_CC_2017_01_20.dat
注意:可以有多行命令,因为我已经为上面的req创建了脚本。谢谢对于您的问题,最简单也是最不复杂的解决方案可能是组合(用于搜索目录层次结构中的文件的工具)和(用于打印与模式匹配的行的工具)。您还可以通过键入
manfind
和mangrep
来阅读这些工具手册
在直接进入解决方案之前,我们需要了解我们将如何处理您的问题。要在搜索的文件名中查找模式,我们将使用带有选项-name
的find
命令:
-name模式
基本文件名(删除前导目录的路径)与shell模式匹配。元字符(“*”、“?”和“[]”)
在基名称的开头匹配“.”(这是对
findutils-4.2.2;见下文标准一致性部分)。忽视
目录及其下的文件,使用-prune;请参见中的示例
描述-路径。支架不被认为是特殊的,
尽管事实上,包括Bash在内的一些shell在支架上嵌入了
贝壳图案中的特殊含义。将执行文件名匹配
使用fnmatch(3)库函数。别忘了
用引号将模式括起来,以防止模式被扩展
贝壳
例如,如果我们想在名为“words\u directory”
的目录中搜索包含字符串“abc”的文件,我们将输入以下内容:
$ find words_directory -name "*abc*"
如果我们要搜索目录中的所有目录:
$ find words_directory/* -name "*abc*"
因此,首先,我们需要查找所有文件,这些文件以字符串“MAG\u L\u NT”
开头,以“.dat”
结尾,因此要在/your/specified/path/
中查找所有匹配的名称,其中包含许多子目录,其中可能包含与此模式匹配的文件:
$ find /your/specified/path/* -name "MAG_L_NT_*.dat"
然而,这会打印所有找到的文件名,但我们仍然会得到包含“SUM”
字符串的名称,grep中有。要排除包含不需要的字符串的名称,我们将使用选项-v
:
-v,-反向匹配
反转匹配的意义,以选择不匹配的线。(-v是
由POSIX指定。)
要使用grep过滤掉第一个命令输出,我们将使用()
:
管道的标准shell语法是列出多个命令,
由竖条分隔(通用Unix术语中的“管道”)。对于
例如,要列出当前目录(ls)中的文件,请仅保留
包含字符串“key”(grep)的ls输出行,并查看
结果是一个滚动页面(更少),用户在
终端的命令行:
ls -l | grep key | less
“ls-l”生成一个进程,其输出(stdout)通过管道传输到
“grep key”过程的输入(stdin);同样地,对于
“少”的过程。每个进程都从上一个进程获取输入
并通过标准流为下一个流程生成输出。每个
“|”指示shell连接上命令的标准输出
左边是命令的标准输入,右边是
进程间通信机制称为(匿名)管道,
在操作系统中实现。管道是单向的;数据
从左到右流经管道
process1 | process2 | process3
在您熟悉了上述用于实现目标的命令和选项后,您已经准备好解决方案:
$ find /your/specified/path/* -name "MAG_L_NT_*.dat" | grep -v "SUM"
此命令将生成所有名称的输出,这些名称以“
”MAG\u L\u NT\uu”
开头,以“.dat”结尾grep-v
将使用第一个命令输出作为输入,并删除包含“SUM”
字符串的所有行。@sudheer113,如果我回答了您的问题,您应该回答,注释部分专门讨论问题,而不是感谢您的回答(您可以通过向上投票来感谢)。阅读更多关于一般规则的信息。