LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
12
返回列表 发新帖
楼主: casio1374633

rm,管道和硬链接的问题

[复制链接]
 楼主| 发表于 2008-2-3 13:43:08 | 显示全部楼层
回10楼.我从新看了下鸟哥的(正规表达法)这个章节.
首先,正规表达法不是一个工具(那么可以说应该不是sh),如果想用正规表达法,那么也要使用具备正规表达法的工具才行(那么rm不是具备正规表达法的工具,而grep,vi,sed,awk是具备的,所以可以用).

另外在下面看到说<注意:正规表达法和万用字符是不一样的.因为万用字符和正规表达法表示的内容是不一样的.要分清出>

那么我大概可以知道,我之所以犯错是因为我把正则表达法和万用字符搞混淆了.
也就是7楼的朋友说的<globbing is NOT RE, ok?>是这个意思吧?
请问remote fish朋友,我这么说是否正确?
回复 支持 反对

使用道具 举报

发表于 2008-2-4 21:03:04 | 显示全部楼层
Post by casio1374633;1813829

还有就是发现在win下分区创建的文件和目录自动为root,组root.属性777..不明原因~~

挂载参数的原因
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-2-4 21:20:20 | 显示全部楼层
回12楼.我使用的是ubuntu7.10,win分区只有ntfs格式.分区是系统自动挂载的.能具体说明下mount的哪个参数会修改这个?一般都是-t的啊?这个分区是装系统时候就自动挂载了.所以不是我手动的...
回复 支持 反对

使用道具 举报

发表于 2008-2-4 22:52:59 | 显示全部楼层
权限位什么的只在linux分区下才有效
回复 支持 反对

使用道具 举报

发表于 2008-2-5 00:28:01 | 显示全部楼层
Linux 的概念,win不一定有。比如硬连接等。所以要试验就用 ext3 这类 linux FS:)。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-2-5 13:09:04 | 显示全部楼层
这是我第二次看到版主回复我的帖子..感激啊~~PS:版主是MM ?

还有个问题是我现在装了cygwin,但是发现shell工具不多啊.连diff都没有.man也很少.我自己在cygwin setup下面也没有找到相关的工具包的安装,想能不能把我lin下面的/bin直接拷贝过去到cygwin相应的目录下使用??


再就是我发现使用gnome下的那个pdf文档查看器pdf以后,adobe的那个就开始出现启动不起来并且占用cpu资源的情况了?冲突?怎么解决?什么原因啊?

-------------------%<----------------------

"expr:写入时发生错误"自己查看说是acroread的一个bug.不过修改成echo $mfile| sed 's/libgtk-x11-\([0-9]*\).0.so.0.\([0-9]\)00*.\([0-9]*\)\|\(.*\)/\1\2\3/g'
后还是没用~~
回复 支持 反对

使用道具 举报

发表于 2008-2-10 09:26:42 | 显示全部楼层
Post by casio1374633;1813870
回10楼.我从新看了下鸟哥的(正规表达法)这个章节.
首先,正规表达法不是一个工具(那么可以说应该不是sh),如果想用正规表达法,那么也要使用具备正规表达法的工具才行(那么rm不是具备正规表达法的工具,而grep,vi,sed,awk是具备的,所以可以用).

另外在下面看到说<注意:正规表达法和万用字符是不一样的.因为万用字符和正规表达法表示的内容是不一样的.要分清出>

那么我大概可以知道,我之所以犯错是因为我把正则表达法和万用字符搞混淆了.
也就是7楼的朋友说的<globbing is NOT RE, ok?>是这个意思吧?
请问remote fish朋友,我这么说是否正确?


抱歉这么多天才回复, 过年真是累啊;)

关于谁来扩展, 这不取决于执行的命令自身是否支持扩展, 而是取决于形式. 一个实际的例子是:
假如当前目录下有 a.c 文件, b/ 目录, b/c.c 文件, 然后我们用 find . -name *.c 进行查找的时候, sh 会对命令进行扩展, 成为 find . -name a.c, 那么此命令就只能找到 a.c 文件. 而若我们将命令改成  find . -name '*.c', 这时候就不再由 sh 进行扩展, 而由 find 自行处理 *.c , 那么就可以找到 a.c, b/c.c 两个文件. 另外如果当前目录下没有 a.c 文件, 那么 sh 扩展不成功, 就会把 '*.c' 原封不动地传递给 find.

现在回到楼主的问题, *~$ 这样的是 grep 兼容的正则表达式, 而在 sh 中 $ 是作为变量的标志符出现的. rm *~$ 正是由 sh 进行扩展的, 所以联系上面的讨论, 我们就可以理解结果为什么是这个样子的了.

下面来说一下如何通过 grep 兼容的正则表达式来利用 rm. 我们知道 rm 不支持从标准输入读入文件名, 它只支持参数的形式, 而 sh 本身的命令扩展又不是正则表达式, 那么我们该如何实现以下目的呢?
* 根据正则表达式来过滤文件名
* 把这些文件名传给 rm
其实这二者都不难. 看以下两个命令

  1. rm $( echo * | grep '^abc.*' )
  2. echo * | grep '^abc.*' | xargs rm
复制代码

第一个是通过 sh 自身的能力, 将命令的输出当作参数进行传递, 而第二个则是利用了 xargs 这样的专门通过管理构建参数的工具.

祝新春快乐!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-2-10 12:17:05 | 显示全部楼层
谢谢remote fish的回复.我在前几天在学习优先执行的时候也有考虑到了你的第一个方法.
输入 rm $(ls -a | grep '~$')后执行成功了.你的第二个使用xargs我还没有见过,刚刚百度了下,确实是个很好的命令,可以完成很强大的工作.

在学习到find的时候,发现通过find也可以实现:
find /home/$UESR/test -user $USER -name  '*~$' -exec rm {} \; -print


---------------------------%<----------------------------------

再你说的关于谁来扩展来,确实是一个小细节.没有仔细看.

再次十分的感谢你,这个帖子的疑问算是暂时告一段落了.如果还有朋友发现其他的问题和疑问请一同讨论,谢谢..
回复 支持 反对

使用道具 举报

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

本版积分规则

快速回复 返回顶部 返回列表