使用
这样做对吗?
ls –a
和 grep
,您如何使用单个 grep 命令列出 /usr 中以字母 p 或字母 r 或字母 s 开头的所有文件的名称?这样做对吗?
ls –a | grep [prs] /usr
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]
更错的是,^
在一些shell(如Bourne shell、rc、es或zsh -o extendedglob)中是特殊字符,但在bash或其他POSIX shell中可以正常使用。
大多数shell(fish是一个值得注意的例外)中,[pqs]
是通配符操作符。这意味着^[qps]
会被shell扩展为与该模式匹配的文件列表(相对于当前目录)。
因此,在像bash这样不特殊处理^
的shell中,如果当前目录中存在名为^p
的文件,则它将变成
ls /usr | grep ^p
如果在 csh , tcsh , zsh 或 bash-O failglob 中找不到匹配的文件,则会收到错误消息并取消命令。在启用了扩展全局搜索的 zsh -o extendedglob 中, ^ [pqs] 将表示除 p , q 或 s 之外的任何文件。
如果你想要查找文件,不要使用 ls
命令。使用 find
命令。
find /usr -name '[prs]*'
如果您不想搜索 /usr 下的整个树,请执行以下操作:
find /usr -maxdepth 1 -name '[prs]*'
ls -ad /usr/[prs]*
,其中-d选项抑制子目录的列表。(cd /usr && ls -ad [prs]*)
我会先使用ls
命令列出目录,然后再应用grep
。另外,您需要添加^
字符才能筛选出只以这些字母开头的文件:
$ ls -a /usr | grep ^[prs]
为什么不直接
find /usr -type f -name '[prs]*'
/usr
下的所有内容,而不仅仅是/usr
本身。 - Kusalananda-maxdepth
参数来解决。这绝对比解析ls
更安全。 - Toby Speight
/usr
下还是在/usr
的任何级别下? - Etan Reisner