Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 选择文件夹中的特定文件_Linux_Shell - Fatal编程技术网

Linux 选择文件夹中的特定文件

Linux 选择文件夹中的特定文件,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)

我想从目录中的文件列表中选择文件的特定格式。请找到下面的例子

我有下面的文件列表(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) 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,如果我回答了您的问题,您应该回答,注释部分专门讨论问题,而不是感谢您的回答(您可以通过向上投票来感谢)。阅读更多关于一般规则的信息。