在linux下,用find查找以abc开头,但不包含“.”的文件的方法


如下三种方法都可以:
1.

  1. find . -name "abc*" ! -name "*.*" -print
2.
  1. find . -regex '.*/abc[^.]*'
3.
  1. find . -name "*.*" -o -name "abc*" -print
第一种方法是最容易理解的了,第二个 -name前的 ! 号表示 -not, 与-not的意义是相同的,所以也可以写成:
find . -name "abc*" -not -name "*.*" -print

第二种方法: 因为用-name选项的时候,find不支持正则表达式,此时要使用 -regex选项
正则式: '.*/abc[^.]*'
.*/ 表示在当前目录及下及目录中找
[^.]* 表示abc后匹配任意字符,除了.

第三种方法看起来很难理解
因为-o 是 or 的意思,也就是或
猛的看起来好像是说找到所有含有. 或者以abc开头的
其实不然
这两个-name构成了这样形式的表达式
Exp1 or Exp2
如果Exp1 为真的话,就不会再判断Exp2
如果Exp1为假,才执行Exp2,非常类似于C语言中的 " || " 符号
所以,如果匹配到有.的文件名,则不会执行后面的了,所以-print此时不会打印

今天也意外的发现了一点
find [path...] [expression]
在最后可以用 -exec command
如下:
find . -name "abc*" -exec ls {} /;
以前一直不明白后面加个 {} /; 是干什么的
今天总算知道了
其实{} 表示匹配到前面的文件
所以,你也可以这样用:
find . -name "abc*" -exec mv {} {}.old /;
此时所完成的功能就是:
将所有以abc开关的文件,全部在后面加上 .old 后缀

【在linux下,用find查找以abc开头,但不包含“.”的文件的方法】(非常感谢CU网友的指点)

    推荐阅读