使用ls –a
和grep
,您将如何列出/ usr中所有文件的名称,以字母p或字母r或字母s开头,使用单个grep命令?使用grep和ls -a命令
这是正确的吗?
ls –a | grep [prs] /usr
使用ls –a
和grep
,您将如何列出/ usr中所有文件的名称,以字母p或字母r或字母s开头,使用单个grep命令?使用grep和ls -a命令
这是正确的吗?
ls –a | grep [prs] /usr
如果你想找到的文件,不要使用ls
。使用find
命令。
find /usr -name '[prs]*'
如果你不希望搜索在/ usr整个树,这样做:
find /usr -maxdepth 1 -name '[prs]*'
她列出了文件,找不到它们(我怀疑这是一个作业问题)。 – Kusalananda
我倒是ls
的目录,然后才应用grep
。此外,你错过了^
字符过滤出以这些字母开头文件:
$ ls -a /usr | grep ^[prs]
非常感谢您的洞察力! –
为什么不
find /usr -type f -name '[prs]*'
因为那会遍历'/ usr'下的所有内容,而不仅仅是'/ usr'本身。 – Kusalananda
这很容易用'-maxdepth'参数修复。它肯定比解析'ls'更安全。 –
ls -a /usr | grep '^[prs]'
将从中ls -a /usr
输出选择(这是由换行符分隔的/usr
中的文件列表)以p
,r
或s
个字符。
这可能是您的老师所期待的,但这是错误的或至少不可靠的。
文件名可以由多行组成,因为换行符与Linux或任何UNIX上的文件名中的任何字符一样有效。因此该命令不会返回名称以p
,q
或s
开头的文件,而是返回以p
,q
或s
开头的文件名的行。通常,您不能可靠地后处理ls
的输出。
-a
是要包含隐藏文件,即名称以.
开头的文件。由于您只希望以p
,q
或s
开头的那些,这是多余的。
需要注意的是:
ls /usr | grep ^[pqs]
会更加错误的。第一个^
是Bourne shell,rc
,es
或zsh -o extendedglob
(尽管在bash
或其他POSIX shell中正常)的几个shell中的特殊字符。
然后,在大多数shell(fish
是一个显着的例外)中,[pqs]
是一个通配符运算符。这意味着^[qps]
应该被shell扩展到匹配该模式的文件列表(相对于当前目录)。
bash
那些炮弹不把
^
特别,如果有一个在当前目录下名为
^p
文件
那么,这将成为
ls /usr | grep ^p
如果没有匹配的文件,在csh
,tcsh
,zsh
或bash -O failglob
,您将收到一条错误消息,该命令将被取消。在zsh -o extendedglob
其中^
是通配符运算符,^[pqs]
意味着任何文件,但是p
,q
或s
。
@twalberg的评论非常适合您提出的选项。 echo会忽略隐藏的文件,但只有当您希望以[prs]开头的文件时才会对其进行过滤。
当您需要其他过滤器的隐藏文件时,类似的解决方案将是ls -ad /usr/[prs]*
,其中-d选项禁止列出子目录。
该解决方案还将显示完整路径,当您首先转到目录时可以抑制该路径。当你想留在当前目录中时,使用它的子shell。当/ usr目录不存在时,我使用& &跳过ls。
(cd /usr && ls -ad [prs]*)
直接在'/ usr'下或'/ usr'下的任何级别? –
直接在/ usr –
'echo/usr/[prs] *'... – twalberg