为什么ls -R(递归向下)不能用于正则表达式

时间:2015-07-09 14:40:34

标签: regex linux ls

就我而言,目录树正在跟随

[peter@CentOS6 a]$ tree  
.  
├── 2.txt  
└── b  
    └── 1.txt

1 directory, 2 files

为什么以下两个命令只能获得2.txt?

[peter@CentOS6 a]$ ls -R *.txt
2.txt
[peter@CentOS6 a]$ ls -R | grep *.txt
2.txt

4 个答案:

答案 0 :(得分:3)

在这两种情况下,在参数命中命令之前,shell正在将*.txt扩展为2.txt。所以,你实际上正在运行

ls -R 2.txt
ls -R | grep 2.txt

你无法告诉ls寻找文件模式 - 这就是find的用途。在第二种情况下,您应该引用您的表达式并使用正确的正则表达式:

ls -R | grep '\.txt'

答案 1 :(得分:2)

您可以使用find查找当前和子目录中的所有匹配文件

find . -name "*.txt"

答案 2 :(得分:1)

如果你问为什么"它是不清楚的。意思"解释输出"或者"应该怎么做"。 Steephen已经回答了后者,这是对前者的回答。

其原因称为" shell扩展"。当您在命令行中键入* .txt时,程序不会将其作为参数获取,而是shell会扩展它,然后传递结果。

* .txt扩展为"当前目录中的所有文件在开头有任意多个符号,以' .txt'结尾。而不是以'。'"。

开头

这意味着当您输入" ls -R *.txt"实际执行的命令是" ls -R 2.txt&#34 ;;当你做" ls -R | grep *.txt"它实际上执行" ls -R | grep 2.txt"。

这就是为什么Steephen在提供的答案中在通配符周围加上引号的确切原因。有必要停止这种扩张。事实上,您也可以使用单引号或在任何特殊字符前放置斜杠。因此,以下任何一项都有效:

find . -name "*.txt"

find . -name '*.txt'

find . -name \*.txt

答案 3 :(得分:0)

没有人提到的另一个问题是,除了shell *grep看到它之前拦截*这一事实外,shell对grep的处理方式与*不同}。

shell使用文件通配,grep表示"任意数量的字符"。

*使用正则表达式,ls -R | grep .\*\\.txt 表示"任何数量的前面的项目"。

您需要做的是

*

  • 转义grep,以便你的shell不会拦截它
  • .期望
  • 的方式正确格式化正则表达式
  • 正确转义.txt中的fmin_bfgs以确保您有文件扩展名