“ ls -a |的奇怪行为” grep ^ \。”


10

我想列出一个密码的内容,只显示以点开头的文件。我尝试过,ls -a | grep ^\.但是我无法弄清楚为什么输出中还包含不以点开头的文件。例如:

Pictures
.pip
.pki
.profile
projects
Public

我知道我可以实现自己想要的,ls -ld .*只是对grep的这种行为感到好奇,我无法解释。



为什么不只ls -d .*列出所有以开头的文件.
Barmar 2015年

注意事项:切勿将ls的输出传递给另一个命令。使用查找代替。ls有太多的意识形态无法信任。参见:mywiki.wooledge.org/BashPitfalls上的陷阱1- 它排名第一!该网站的其余部分也很棒。
2015年

Answers:


20

用引号引述grep,因此ls -a | grep '^\.'

原因是外壳程序\.将其处理并将其转换回plain .grep然后将其视为单字符通配符。如有疑问,请始终引用包含(或可能包含)外壳程序特殊字符的字符串。


为什么shell忽略\?
ps-aux

\是一个转义序列,使外壳程序将以下字符视为原义字符。在此grep ^\\.,外壳程序将\\视为单个反斜杠,而grep再次将单个反斜杠视为后跟点,将其视为文字点。
Avinash Raj 2015年

11

您需要将grep regex放在引号内。

ls -a | grep '^\.'

注意:不要解析lscommand 的输出


为什么解析ls的输出很糟糕?
ps-aux

通过链接:在默认模式下,如果标准输出不是终端,则ls用换行符分隔文件名。除非您有一个名称中带有换行符的文件,否则这很好。
Michael Durrant 2015年

@Michael Durrant:我建议在文件名中允许换行符是一个主要的系统错误。
jamesqf 2015年

@jamesqf-查看文件名中的换行符(尤其是sml的答案)。
don_crissti 2015年

0

如果执行cmd ls -a | grep ^ \。那么grep不会将“ \”视为特殊字符和“”的含义。不要逃脱。

当我们使用cmd ls -a | grep“ ^ \”。然后grep会将“ \”视为特殊字符,并表示“”。逃脱了。它会给您预期的结果。

如果要使用不带引号的grep cmd,则也应转义“ \”字符。通过执行以下命令,可以得到没有双引号的预期结果。 ls -a | grep ^ \\。

有关正则表达式中特殊字符含义的详细信息,请参见以下链接。 http://www.regular-expressions.info/quickstart.html

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.