find -name 文件通配符必须使用双引号

shell通配符易出错点
ls -l ab*
find . -name “abc*”

这里的*都是shell的文件通配符,包括 * ? []

首先文件通配符和正则表达式含义是不同的。最大的差别在于:
1."*" 在正则表达式中表示前面的字符重复任意次数,所以表示任意字符串".*", shell通配符中* 就表示任意字符串
2. ".“在正则表达式中是任意一个字符,在通配符中没有其他任何含义,在通配符中”?"表示一个任意的字符

shell 本身会对*进行解析,所以如果不希望shell解析"*", 就一定要把通配符用双引号括起来(单引号使用后,就什么都替换不了)

ls -l ab* 这个*由shell来解析的,假如目录下面有ab1 abc ab2, 那这个命令首先会被shell转化为ls -l ab1 abc ab2。 ls本身没有解析通配符的能力。
ls -l “ab*”, 那就会什么都没有,因为没有一个文件的名字是ab*

find . -name "abc*"这个参数会原封不动的传给find, find命令本身具备解析通配符的能力,会在当前目录下面的各级目录下面寻找以abc开头的文件。
find . -name abc* 那通配符会被shell解析,如果当前目录下没有以abc开头的文件,那传给find命令的就是空的,相当于:
find . -name
find: missing argument to `-name’

如果当前目录下游多个abc开头的文件,会出错,相当于:
find . -name abc1 abc2
find: paths must precede expression: abc2 就是说第二个name前面没有指定寻找的路径,

如果当前目录下面只有一个abc开头的文件,那就不会出错,但是相当于:
find . -name abc1
最终最在所有的目录下面搜索abc1的文件,和我们的本意大相径庭。

记住,-name选项搜索的是basename,不要再里面带"/"

再提一下grep. grep [-option] pattern file
这里的pattern是正则表达式,必须用双引号 括起来,否则被shell解析。file部分没有pattern,所以grep自己的文件是没有解析能力的,file里面如果有通配符,必须由shell解析,可见得文件部分的通配符必须没有双引号。
grep -i “main.*hello” .c
在当前的目录下的所有的c源文件中搜索同时含有main和hello的语句
shell本身的文件通配符解析的能力比较弱,只对当前目录下的文件有效。
要想对多层目录有效:
grep -r ‘hello’ /home/gigi
但是这个不能指定文件的名称,再指定文件名称的pattern
find /home/gigi -name '.c’ -print0 | xargs -0r grep -H ‘hello’
grep -rH --include=’*.c’ ‘hello’ /home/gigi
————————————————
版权声明:本文为CSDN博主「hardcareer」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/hardcareer/article/details/89024352

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值