find命令查找 排除某个文件或目录 -o -a 选项使用

3年前 (2016-11-10) Jason Liu 命令相关, 运维 0评论 已收录 1223℃
今天线上服务故障,处理完成后开发有个日志文件需要过滤,于是使用了find . -type f|xargs grep "过滤字符串" 帮他解决
于是思考了下find的用法,要是我查找出来的文件或目录有的需要排除怎么办?
网上查找了相关资料后得出如下:
排除单个文件
find . -type f ! -name "要排除的文件名"
排除多个文件
find . -type f ! -name "要排除的文件名" ! -name "要排除的文件名" 。。。。
排除某个目录和目录下的所有文件
[[email protected] ~]# ls svntest/
11.txt  initrd.img  test
[[email protected] ~]# tree svntest/
svntest/
├── 11.txt
├── initrd.img
└── test
├── 1
├── 2
└── 31 directory, 5 files
[[email protected] ~]#

我需要查找svntest目录下的所有文件并排除test目录和下面所有文件
[[email protected] ~]# find ./svntest/ -path "./svntest/test" -prune -print
./svntest/test
[[email protected] ~]# find ./svntest/ -path "./svntest/test" -prune -o -print
./svntest/
./svntest/.svn
./svntest/.svn/text-base
./svntest/.svn/text-base/11.txt.svn-base
./svntest/.svn/text-base/initrd.img.svn-base
./svntest/.svn/entries
./svntest/.svn/tmp
./svntest/.svn/tmp/text-base
./svntest/.svn/tmp/prop-base
./svntest/.svn/tmp/props
./svntest/.svn/prop-base
./svntest/.svn/prop-base/initrd.img.svn-base
./svntest/.svn/props
./svntest/initrd.img
./svntest/11.txt
[[email protected] ~]#
不加-o参数相当于  find ./svntest/ -path "./svntest/test" -prune -a -print
前面的执行成功了, -a后面的也执行成功了才会返回正确结果
怎么理解呢?
就是./svntest/test这个目录匹配了就为真,后面的print才会执行
其他的文件不不匹配./svntest/test 这个目录,就为假,后面的print就不会执行了
加了-o参数的命令 find ./svntest/ -path "./svntest/test" -prune -o -print
前面的执行成功了,后面的就不执行了;前面的执行失败了,后面的才会执行
怎么理解呢?
就是./svntest/test这个目录匹配了就为真,-o后面的print就不执行了
其他文件不匹配./svntest/test这个目录就为假,-o后面的print就会执行
find ./svntest/  ! \( -path "./svntest/test" -prune \) 也能实现排除效果
等价于 find ./svntest/  ! \( -path "./svntest/test*" \)
排除目录方法
-path  匹配文件和目录(匹配项可以出现斜线'/') 排除目录时,目录中通常有'/'
-name  匹配文件和目录(匹配项不能出现斜线'/')
       -path和-name 的区别:
[[email protected] nihao]# ll
total 0
drwxr-xr-x 2 root root 33 Mar 6 16:34 123
-rw-r--r-- 1 root root 0 Mar 6 16:22 1.txt
drwxr-xr-x 2 root root 30 Mar 6 16:35 234
-rw-r--r-- 1 root root 0 Mar 6 16:33 2.txt
-rw-r--r-- 1 root root 0 Mar 6 16:33 3.txt
[[email protected] nihao]# find
.
./1.txt
./123
./123/test.txt
./123/t.txt
./2.txt
./3.txt
./234
./234/1.txt
./234/2.txt
            -path 通常用来匹配带有路径的目录和文件(用通配符去目录链里匹配内容)
[[email protected] nihao]# find -path "./123*"
./123
./123/test.txt
./123/t.txt
            -name  通常用来匹配一个文件(用通配符直接匹配一个最终文件)
[[email protected] nihao]# find -name "1.txt"
./1.txt
./234/1.txt
-prune    通常和-path 一起使用,  意思是防止find进入目录里面去

 -print 打印输出
-a 且
-o 或

相关推荐

嗨、骚年、快来消灭0回复。