免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 8780 | 回复: 9
打印 上一主题 下一主题

关于find和通配符的一点疑问(?和*的处理) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-04-08 11:11 |只看该作者 |倒序浏览
初来贵地,一事请教,发在新手园地里吧
目录结构:
[root@cms test]# ls -R
.:
dir1  dir11  lo  test

./dir1:
test  test7  test8  test9

./dir11:
test  test11  test222  test3333


然后打开了set -x模式
执行命令和结果:
[root@cms test]# find ./ -name test?
+ find ./ -name 'test?'
./dir1/test7
./dir1/test8
./dir1/test9

[root@cms test]# find ./ -name test\?
+ find ./ -name 'test?'
./dir1/test7
./dir1/test8
./dir1/test9

[root@cms test]# find ./ -name test*
+ find ./ -name test
./test
./dir11/test
./dir1/test
[root@cms test]# find ./ -name test\*
+ find ./ -name 'test*'
./test
./dir11/test
./dir11/test222
./dir11/test3333
./dir11/test11
./dir1/test
./dir1/test7
./dir1/test8
./dir1/test9
此处的?和*都是通配符吧,那为什么'?'在使用转义符'\'后的结果都可以成功转义而使得输出结果一样,而'*'不可以呢?而且搜索了相关内容,说得都是如果没有进行转义,那么find的应该是‘test*’这个字符串,而实际find却是‘test’呢?

论坛徽章:
0
2 [报告]
发表于 2008-04-08 14:38 |只看该作者
顶一下!!等答案!!

论坛徽章:
0
3 [报告]
发表于 2008-04-08 17:16 |只看该作者
原帖由 东方_未明 于 2008-4-8 14:38 发表
顶一下!!等答案!!


find test*的结果就是这样子的
表示以test开始的字符串。

论坛徽章:
0
4 [报告]
发表于 2008-04-08 17:30 |只看该作者
你使用 echo 看一下就知道實際傳入情況。像是:

  1. find ./ -name test\*
复制代码


--

论坛徽章:
0
5 [报告]
发表于 2008-04-08 18:03 |只看该作者
原帖由 weixuejun 于 2008-4-8 17:16 发表


find test*的结果就是这样子的
表示以test开始的字符串。


问题是"以test开始的字符串"应该包括test22、test7等这些吧,可实际查询的只是test啊!

论坛徽章:
0
6 [报告]
发表于 2008-04-08 18:07 |只看该作者

回复 #4 kenduest 的帖子

echo test* 和echo test\*的结果是一样的,都是test*
另外我不明白的主要是为什么对通配符的处理不一样,?可以不加\,而*必须加\呢
以前搜索一直用类似test*的方法,应该漏过很多东西。。。。

论坛徽章:
0
7 [报告]
发表于 2008-04-08 18:18 |只看该作者
原帖由 东方_未明 于 2008-4-8 18:07 发表
echo test* 和echo test\*的结果是一样的,都是test*
另外我不明白的主要是为什么对通配符的处理不一样,?可以不加\,而*必须加\呢
以前搜索一直用类似test*的方法,应该漏过很多东西。。。。


這個是正確的語法:

  1. find /path -type f -name "test*"
复制代码


若是你改成這樣:

  1. find /path -type f -name test*
复制代码


那 shell 會先處理 test* 的尋找與帶入,若是該好目前工作目錄內找不到 test* 相關檔案目錄,那 shell 維持原本的傳入參數不會改變。但是若是有找到檔案就不一樣結果了。

比方目前目錄有 test1.txt test2.txt test3.txt,那實際上會變成:

  1. find /path -type f -name test1.txt test2.txt test3.txt
复制代码


可以想見語法錯誤,那結果更不用說了。

--

论坛徽章:
0
8 [报告]
发表于 2008-04-09 15:19 |只看该作者
明白了,是由于测试时下面有test文件所致,"shell 會先處理 test* 的尋找",那么找到匹配的test后在查询的时候就把test传给了find,所以出现了上述结果
如果把文件test改名为test*的话那么命令就会返回理想的结果,虽然*的含义有变化
如果待查目录中包含如testt的文件的话那么使用test?搜索也会与期望不同
所以我的问题中?和* 的处理本身就是错误的.
感谢斑竹,一语中的.

论坛徽章:
0
9 [报告]
发表于 2008-04-10 00:35 |只看该作者
彻底糊涂了!

自己测试结果是:
1、find命令所跟的参数(也就是"test*")中包括通配符的搜索时,都要用“”或‘’括起来,才能表达自己意图。这个成立!
2、那find ./ -name test\?
      find ./ -name test?
      find ./ -name 'test?'
         三条命令的结果都被认为是find ./ -name 'test?'呢??
3、而find ./ -name test*
     却被认为find ./ -name test  ???
     而find ./ -name test\*
     却被认为find ./ -name 'test *'

给我的想法只有一个,对于find命令的参数中如果包括特殊字符的话请“”起来。

论坛徽章:
0
10 [报告]
发表于 2008-04-10 01:09 |只看该作者
原帖由 志国 于 2008-4-10 00:35 发表
彻底糊涂了!

自己测试结果是:
1、find命令所跟的参数(也就是"test*")中包括通配符的搜索时,都要用“”或‘’括起来,才能表达自己意图。这个成立!
2、那find ./ -name test\?
      find . ...


解釋方式與之前我回應那篇一樣....

通配字元像是 * 與 ? 都是給 find 本身自己處理的,因為不打算給 shell 先展開處理所以得使用單引 or 雙引符號包起來。

您的問題部份,這個是正確的語法:

  1. find /path -type f -name "test?"
复制代码


若是你改成這樣:

  1. find /path -type f -name test?
复制代码


那 shell 會先處理 test? 的尋找與帶入,若是該好目前工作目錄內找不到符合 test? 相關檔案目錄,那 shell 維持原本的傳入參數不會改變,結果就是:

  1. find /path -type f -name test?
复制代码


實際 find 收到 test? 這個字串就是。

但是若是目前工作目錄有找到檔案就不一樣結果了。比方目前目錄有 test1 test2 test3,那實際上會變成:

  1. find /path -type f -name test1 test2 test3
复制代码


可以想見語法錯誤,那結果更不用說了。

--
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP