免费注册 查看新帖 |

Chinaunix

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

[文件目录] 关于星号(*)的一个问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-12-29 01:10 |只看该作者 |倒序浏览
用find命令查找当前目录下任何文件名的普通文件时,如果用以下命令:
find . -name * -type f

则会提示:

find: 路径必须在表达式之前: dir0
用法: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]

如果把星号quote掉,就可以执行
find . -name \* -type f
或者
find . -name "*" -type f
或者
find . -name '*' -type f

执行结果都一样”:
./file.bak
./services.zip
./newdir.tar.gz
./file.both
./test1
./newdir/newfile5
./dir1/dir10/dir100.txt
./dir1/dir11/dir110.txt
./tmp.log
./test


问题1:
正确执行的命令,星号是被当作wildcard还是被当作RE中的一个modifier?

if(result(问题1)== wildcard) then
    问题2:
    星号(*)在command line里面是个meta,属于wildcard,代表匹配0个或多个字符,为什么不能用在-name后面的argument里面呢?

else if (result(问题1)== RE中的一个modifier)then
    问题3:
    如果quote掉,星号代表RE中的一个修饰字符(modifier),表示前一个字符集出现0次或者多次,上面正确执行的命令里面没有在星号前面给出任何字符集(char.set),这样的话星号只能代表一个普通字符啊。RE中的(.)点号表示任意单一字符,我用命令find . -name ".*" -type f 测试,结果是:
    ./.test.swp
    ./.test1.swp
这个又说明星号是重复他前面的字符集(char.set),点号在这里也仅仅代表一个普通字符而已。他们并不能被看作是RE。

else
    救救我。



论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
2 [报告]
发表于 2012-12-29 08:07 |只看该作者
*不但对于 find -name是特殊字符,对于shell也是特殊字符
echo \*
echo *对比一下

论坛徽章:
0
3 [报告]
发表于 2012-12-30 17:09 |只看该作者
waker 发表于 2012-12-29 08:07
*不但对于 find -name是特殊字符,对于shell也是特殊字符
echo \*
echo *对比一下



你的意思是星号(*)在find -name里面有一套独特的定义?属于find -name的特殊字符(meta)?既不是RE的特殊字符(meta)也不是通配符(wildcard)?

论坛徽章:
33
ChinaUnix元老
日期:2015-02-02 08:55:39CU十四周年纪念徽章
日期:2019-08-20 08:30:3720周年集字徽章-周	
日期:2020-10-28 14:13:3020周年集字徽章-20	
日期:2020-10-28 14:04:3019周年集字徽章-CU
日期:2019-09-08 23:26:2519周年集字徽章-19
日期:2019-08-27 13:31:262016科比退役纪念章
日期:2022-04-24 14:33:24
4 [报告]
发表于 2012-12-30 20:05 |只看该作者
回复 3# new2004boy


在不加引号或者转义的情况下,*是个通配符,在真正的find命令执行之前,shell会把它解释成类似这个样子:
find . -name a.txt b.txt c.txt
于是就报错了

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
5 [报告]
发表于 2012-12-31 10:24 |只看该作者
回复 3# new2004boy


    特殊的意思是不普通,比如你用*.txt并不是想找一个名为"*.txt"的文件而是想找名字以.txt结尾的文件

论坛徽章:
0
6 [报告]
发表于 2012-12-31 16:16 |只看该作者
本帖最后由 new2004boy 于 2012-12-31 16:17 编辑

回复 4# Shell_HAT

这个解释比较合理,谢谢

论坛徽章:
0
7 [报告]
发表于 2012-12-31 16:17 |只看该作者
回复 5# waker

明白了,谢谢

   

论坛徽章:
1
辰龙
日期:2014-05-22 11:38:58
8 [报告]
发表于 2012-12-31 16:52 |只看该作者
  1. $ESC *
  2. Inserts the results of an autocompletion in the command line

  3. Pressing ESC then * will insert in the command line the results of the autocompletion.

  4. It's hard to explain but if you look the sample output or do
  5. echo ESC *

  6. you will understand quickly.

  7. By the way, few reminders about ESC :

  8. - Hold ESC does the same thing as tab tab

  9. - 'ESC .' inserts the last argument of last command (can be done many times in order to get the last argument of all previous commands)
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP