使用 grep 和 ls -a 命令

问题描述 投票:0回答:6

使用

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

这样合适吗?

ls –a | grep [prs] /usr
linux shell unix grep ls
6个回答
20
投票
 ls -a /usr | grep '^[prs]'

将从

ls -a /usr
的输出中选择以
/usr
p
r
字符开头的行。

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

文件名可以由多行组成,因为换行符与 Linux 或任何 Unix 上文件名中的任何字符一样有效。因此,该命令不会返回名称以

s

p
q
开头的文件,而是返回以
s
p
q
开头的文件名行。通常,您无法可靠地对
s
的输出进行后处理。

ls

是包含隐藏文件,即名称以

-a
开头的文件。因为您只想要那些以
.
p
q
开头的内容,所以这是多余的。

请注意:

s

那就更错了。第一个 
ls /usr | grep ^[pqs]

是一些 shell 中的特殊字符,例如 Bourne shell、

^
rc
es
(尽管在
zsh -o extendedglob
或其他 POSIX shell 中也可以)。

然后,在大多数 shell 中(

bash

是一个值得注意的例外),

fish
是一个通配符。这意味着
[pqs]
将由 shell 扩展到与该模式匹配的文件列表(相对于当前目录)。

所以在像

^[qps]

这样不专门对待

bash
的shell中,如果当前目录中有一个名为
^
的文件,那么它将变成

^p

如果在 
ls /usr | grep ^p

csh
tcsh
zsh
中没有匹配的文件,您将收到一条错误消息,并且命令将被取消。在
bash -O failglob
中,其中
zsh -o extendedglob
是通配符,
^
表示除
^[pqs]
p
q
之外的任何文件。
    


15
投票
s

。使用

ls
命令。

find

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

find /usr -name '[prs]*'



4
投票
当您想要为其他过滤器隐藏文件时,类似的解决方案是

find /usr -maxdepth 1 -name '[prs]*'
,其中 -d 选项禁止列出子目录。

该解决方案还将显示完整路径,当您首先转到目录时可以将其抑制。如果您想保留在当前目录中,请使用子 shell。当 /usr 目录不存在时,我使用 && 跳过 ls。

ls -ad /usr/[prs]*



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

目录,然后才应用

ls
。另外,您缺少
grep
字符来仅过滤掉以这些字母
start
的文件: ^



0
投票

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



0
投票
.csv | grep '^[Kk][Ss]

' 输出:文件列表 比方说,您还想要计算文件的数量,而不仅仅是列出它们 bash-4.4$ ls .csv | grep '^[Kk][Ss]'|wc -l 输出:42 假设您想要文件的大小 bash-4.4$ ls -ls

© www.soinside.com 2019 - 2024. All rights reserved.