使用
ls –a
和 grep
,如何使用单个 grep 命令列出 /usr 中以字母 p 或字母 r 或字母 s 开头的所有文件的名称?
这样合适吗?
ls –a | grep [prs] /usr
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
之外的任何文件。s
。使用
ls
命令。find
如果您不想搜索 /usr 下的整个树,请执行以下操作:
find /usr -name '[prs]*'
find /usr -maxdepth 1 -name '[prs]*'
,其中 -d 选项禁止列出子目录。
该解决方案还将显示完整路径,当您首先转到目录时可以将其抑制。如果您想保留在当前目录中,请使用子 shell。当 /usr 目录不存在时,我使用 && 跳过 ls。
ls -ad /usr/[prs]*
(cd /usr && ls -ad [prs]*)
目录,然后才应用
ls
。另外,您缺少 grep
字符来仅过滤掉以这些字母 start的文件:
^
$ ls -a /usr | grep ^[prs]
' 输出:文件列表 比方说,您还想要计算文件的数量,而不仅仅是列出它们 bash-4.4$ ls .csv | grep '^[Kk][Ss]'|wc -l 输出:42 假设您想要文件的大小 bash-4.4$ ls -ls