2015-05-28 72 views
6

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

这是正确的吗?

ls –a | grep [prs] /usr 
+0

直接在'/ usr'下或'/ usr'下的任何级别? –

+0

直接在/ usr –

+0

'echo/usr/[prs] *'... – twalberg

回答

4

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

find /usr -name '[prs]*' 

如果你不希望搜索在/ usr整个树,这样做:

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

她列出了文件,找不到它们(我怀疑这是一个作业问题)。 – Kusalananda

0

我倒是ls的目录,然后才应用grep。此外,你错过了^字符过滤出以这些字母开头文件:

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

非常感谢您的洞察力! –

0

为什么不

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

因为那会遍历'/ usr'下的所有内容,而不仅仅是'/ usr'本身。 – Kusalananda

+0

这很容易用'-maxdepth'参数修复。它肯定比解析'ls'更安全。 –

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

将从中ls -a /usr输出选择(这是由换行符分隔的/usr中的文件列表)以prs个字符。

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

文件名可以由多行组成,因为换行符与Linux或任何UNIX上的文件名中的任何字符一样有效。因此该命令不会返回名称以p,qs开头的文件,而是返回以p,qs开头的文件名的行。通常,您不能可靠地后处理ls的输出。

-a是要包含隐藏文件,即名称以.开头的文件。由于您只希望以pqs开头的那些,这是多余的。

需要注意的是:

ls /usr | grep ^[pqs] 

会更加错误的。第一个^是Bourne shell,rceszsh -o extendedglob(尽管在bash或其他POSIX shell中正常)的几个shell中的特殊字符。

然后,在大多数shell(fish是一个显着的例外)中,[pqs]是一个通配符运算符。这意味着^[qps]应该被shell扩展到匹配该模式的文件列表(相对于当前目录)。

bash那些炮弹不把 ^特别,如果有一个在当前目录下名为 ^p文件

那么,这将成为

ls /usr | grep ^p 

如果没有匹配的文件,在cshtcshzshbash -O failglob,您将收到一条错误消息,该命令将被取消。在zsh -o extendedglob其中^是通配符运算符,^[pqs]意味着任何文件,但是p,qs

2

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

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