使用grep和ls -a命令

时间:2015-05-28 18:56:48

标签: linux unix grep command ls

使用ls –agrep,如何使用单个grep命令列出/ usr中以字母p或字母r或字母s开头的所有文件的名称?

这是对的吗?

ls –a | grep [prs] /usr

5 个答案:

答案 0 :(得分:6)

如果您要查找文件,请不要使用ls。使用find命令。

find /usr -name '[prs]*'

如果您不想搜索/ usr下的整个树,请执行以下操作:

find /usr -maxdepth 1 -name '[prs]*'

答案 1 :(得分:4)

 ls -a /usr | grep '^[prs]'

将从ls -a /usr的输出(由换行符分隔的/usr中的文件列表)中选择以p,{{1}开头的行开头}或r个字符。

这可能是你的老师所期待的,但这是错误的,或者至少是不可靠的。

文件名可以由多行组成,因为换行符与Linux或任何unix上的文件名中的任何字符一样有效。因此该命令不会返回名称以spq开头的文件,而是返回以s开头的文件名行,{{1} }或p。通常,您无法可靠地对q的输出进行后处理。

s包含隐藏文件,即名称以ls开头的文件。由于您只需要以-a.p开头的广告,因此这是多余的。

请注意:

q

会更加错误。第一个s是一些shell中的特殊字符,例如Bourne shell,ls /usr | grep ^[pqs] ^rc(尽管在es或其他POSIX shell中都可以)

然后,在大多数shell(zsh -o extendedglob是一个值得注意的例外)中,bash是一个全局运算符。这意味着fish意味着由shell扩展到与该模式匹配的文件列表(相对于当前目录)。

所以在像[pqs]这样的shell中,如果没有特别处理^[qps],如果当前目录中有一个名为bash的文件,那将会成为

^

如果在^pls /usr | grep ^p cshtcsh中没有匹配的文件,您将收到错误消息,该命令将被取消。在zsh其中bash -O failglob是一个全局运算符,zsh -o extendedglob表示除^^[pqs]p之外的任何文件。

答案 2 :(得分:2)

@twalberg的评论非常适合您提出的选项。 echo忽略隐藏文件,但是当您只想要以[prs]开头的文件时,这些文件将被过滤 当您想要其他过滤器的隐藏文件时,类似的解决方案是ls -ad /usr/[prs]*,其中-d选项会禁止子目录列表。
该解决方案还将显示完整路径,当您首先转到目录时可以将其抑制。如果要保留在当前目录中,请使用子shell。我用&&当/ usr dir不存在时跳过ls。

(cd /usr && ls -ad [prs]*)

答案 3 :(得分:0)

ls目录,然后才应用grep。此外,您错过了^字符,只过滤了开始这些字母的文件:

$ ls -a /usr | grep ^[prs]

答案 4 :(得分:0)

为什么不

 find /usr -type f -name '[prs]*'