您的位置:首页 > 其它

find / ls / grep /Emacs regexp 区别 及Meta

2012-08-15 18:41 92 查看
1:文件名的生成

在Linux中有很多适用文件作为命令参数,我们可以通过通配符进行文件名的生成。注意[...]形式,是取出其所列范围中的一个,然后只要符合就行。

注意ls / find 与 grep 中的通配符是有区别的,因为前两个命令都是针对文件名 而grep是针对的文件中内容的匹配。

下面这个列表是针对文件名匹配的时候的匹配模式

* 在文件名匹配表示的是匹配任何数量的字符或字符串,而不像grep 里面*与前一个字符组合表示0个或多个字符。

? 在文件名匹配指单个字符,而在grep里面.是单个字符

. 在文件名匹配中就是一个普通字符点,而在grep中特殊为指单个字符。因为文件夹或文件的话,dot肯定很多,我感觉他们可能就是处于这个原因把它设置为普通字符了。

program* 在find / lc 中表示以program开头,在Emacs中是^program

.el 表示以.el结尾 在Emacs中是\.el$

对于Emacs中不论你是针对文件名还是函数名之类的都是类似与grep中针对文件匹配的那些模式。

下面是针对ls的一些实例,是对上面所述的佐证。



2:关于find 后面匹配模式是否加引号的问题。

情况一:其实你坚持个原则就是如果是通配符*你让find接受时是*就行,只要不是\*;也就是想啥最终到find时是啥就行。所以一般情况下单写*file 不加引号也是可以的,你可以在终端中尝试输入echo *file 它的值仍旧是*file。而如果文件名叫$file你就要注意了,因为shell碰见$就会去找这个变量的值,否则为空,所以这个时候你要加一对单引号,取消特殊含义。

情况二:当你想查找以aspell开头的文件时,要加引号否则会报错说 “find: 路径必须在表达式之前: /”

$ sudo find / -mount -name '.aspell*'

其实下面的信息也给出了为啥 find 后面.aspell*要加引号,因为你发现shell默认把*当成特殊字符了,就跟$似的,它会输出一堆在当前文件夹中的符合匹配,而ls在后面加*就正好符合它的意愿,因为它可以对一个列表中的东西进行处理。

下面的图可以解决我们如下的疑惑:

find / -mount -name '.aspell*'为啥要加引号,可以时双引号或单引号,因为下面的echo形式说明shell碰见*的话,表示任何字符串,所以得到的就是一个列表形式。所以这个时候你得尝试""是否能够消除它的特殊性,仅验证可以。

find / -mount -name '$aspell' 必须加单引号,或者转义。跟上面的原因稍微有点区别,这个是本意想把$当成普通字符处理的,所以既可以通过加单引号消除特殊。

find / -mount -name "[et]*" 其实我也是才知道原来echo [et]*的值相当与进行了正则表达式的匹配.通过比较他们报错的信息跟直接echo的值,说明ecb.tar.gz 前差了一个/很明显就是说find处理的必须时一个单一形式,而不是列表。所以当echo [2]*它只匹配出来一个值,这个就可以find成功了。正好符合猜想。

总结:find与ls的对比区别,find是只要确保输入到它的时候,输入的是一个单一形式(与确定值的含义不同);而ls确保它后面可以是一个匹配的字符串列表,如ls -al a.txt b.txt 实际上*就是先得到这个形式再传给ls(我猜的)。同样它可以接一个正则表达式形式如ls -al [ab].txt ....





Meta-Character and regexp(精华贴)

Linux Shell 通配符、元字符、转义符使用实例介绍

在查找文件时使用通配符

grep正则表达式
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: