就我而言,目录树正在跟随
[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
答案 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
以确保您有文件扩展名