使用grep和ls -a命令

27
使用 ls –agrep,您如何使用单个 grep 命令列出 /usr 中以字母 p 或字母 r 或字母 s 开头的所有文件的名称?
这样做对吗?
ls –a | grep [prs] /usr

2
直接位于/usr下还是在/usr的任何级别下? - Etan Reisner
直接放在 /usr 下面 - Nicole Romain
1
回显 /usr/[prs]* - twalberg
5个回答

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

ls -a /usr的输出中(它是以换行字符分隔的/usr中文件的列表)选择以prs字符开头的行。

这可能是您的老师期望的,但这是错误的或者至少不可靠。

文件名可以由许多行组成,因为在Linux或任何Unix上,换行符与任何其他字符一样有效。 因此,该命令不返回其名称以pqs开头的文件,而是以pqs字符开头的文件名的行。通常情况下,您不能可靠地后处理ls的输出。

-a用于包括隐藏文件,即名称以. 开头的文件。由于您只想要以pqs字符开头的文件,因此这是冗余的。

请注意:

ls /usr | grep ^[pqs]

更错的是,^在一些shell(如Bourne shell、rc、es或zsh -o extendedglob)中是特殊字符,但在bash或其他POSIX shell中可以正常使用。

大多数shell(fish是一个值得注意的例外)中,[pqs]是通配符操作符。这意味着^[qps]会被shell扩展为与该模式匹配的文件列表(相对于当前目录)。

因此,在像bash这样不特殊处理^的shell中,如果当前目录中存在名为^p的文件,则它将变成

ls /usr | grep ^p

如果在 csh , tcsh , zsh 或 bash-O failglob 中找不到匹配的文件,则会收到错误消息并取消命令。在启用了扩展全局搜索的 zsh -o extendedglob 中, ^ [pqs] 将表示除 p , q 或 s 之外的任何文件。


14

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

find /usr -name '[prs]*'

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

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

4
@twalberg的评论非常适合您所问的选项。 echo命令会忽略隐藏文件,但当您只想要以[prs]开头的文件时,这些文件将被过滤。
当您需要其他筛选器的隐藏文件时,类似的解决方案是ls -ad /usr/[prs]*,其中-d选项抑制子目录的列表。
该解决方案还将显示完整路径,当您首先进入目录时可以抑制它。当您想要保留在当前目录中时,请使用子shell。我使用&&来跳过ls命令,当/usr目录不存在时。
(cd /usr && ls -ad [prs]*)

1

我会先使用ls命令列出目录,然后再应用grep。另外,您需要添加^字符才能筛选出只以这些字母开头的文件:

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

0

为什么不直接

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

1
因为这将遍历/usr下的所有内容,而不仅仅是/usr本身。 - Kusalananda
这很容易通过-maxdepth参数来解决。这绝对比解析ls更安全。 - Toby Speight

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接