使用ls –a
和grep
,如何使用单个grep命令列出/ usr中以字母p或字母r或字母s开头的所有文件的名称?
这是对的吗?
ls –a | grep [prs] /usr
答案 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上的文件名中的任何字符一样有效。因此该命令不会返回名称以s
,p
或q
开头的文件,而是返回以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
的文件,那将会成为
^
如果在^p
,ls /usr | grep ^p
,csh
或tcsh
中没有匹配的文件,您将收到错误消息,该命令将被取消。在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]*'