Nic*_*ain 10 unix linux grep command ls
使用ls –a
和grep
,如何使用单个grep命令列出/ usr中以字母p或字母r或字母s开头的所有文件的名称?
这是对的吗?
ls –a | grep [prs] /usr
Run Code Online (Sandbox Code Playgroud)
ls -a /usr | grep '^[prs]'
Run Code Online (Sandbox Code Playgroud)
将从输出选择ls -a /usr
(这是文件的列表中的/usr
由换行字符分隔)由任一的开始的行p
,r
或s
字符。
那可能是您的老师所期望的,但这是错误的,或者至少是不可靠的。
文件名可以由多行组成,因为换行符与Linux或任何UNIX上文件名中的任何字符一样有效。这样的命令不会返回其名称开头的文件p
,q
或s
,但与启动文件名的线条p
,q
或s
。通常,您不能ls
可靠地对输出进行后处理。
-a
包括隐藏文件,即名称以开头的文件.
。既然你只希望那些以p
,q
或者s
,这是多余的。
注意:
ls /usr | grep ^[pqs]
Run Code Online (Sandbox Code Playgroud)
会更加错误。首先^
是在像Bourne shell的几个炮弹特殊字符rc
,es
或zsh -o extendedglob
(尽管在OK bash
或其他POSIX弹)。
然后,在大多数shell中(fish
作为一个显着的例外),[pqs]
是一个遍历运算符。这意味着它将^[qps]
由Shell扩展到与该模式匹配的文件列表(相对于当前目录)。
因此,在诸如此类的shell中bash
,不要^
特别对待,如果^p
当前目录中有一个文件被调用,它将变成
ls /usr | grep ^p
Run Code Online (Sandbox Code Playgroud)
如果没有匹配的文件,在csh
,tcsh
,zsh
或者bash -O failglob
,你会得到一个错误信息,该命令将被取消。在zsh -o extendedglob
这里^
是一个通配符操作,^[pqs]
将意味着任何文件,但是p
,q
还是s
。
如果您要查找文件,请不要使用ls
。使用find
命令。
find /usr -name '[prs]*'
Run Code Online (Sandbox Code Playgroud)
如果您不想在/ usr下搜索整个树,请执行以下操作:
find /usr -maxdepth 1 -name '[prs]*'
Run Code Online (Sandbox Code Playgroud)