从零开始学Linux_10_find

一、find命令(搜索文件)
1、find命令的主要作用是对树形目录层次结构进行彻底检查。
2、find命令的一般格式:
     find pathname -expressions


二、find常用表达式
1、有三种表达式,选项表达式(不常用),条件表达式和操作表达式
-mount 选项表达式,用来防止find命令的搜索范围超出当前文件系统的边界。返回值常为真。
-group grp 条件表达式,检查当前的文件是否具有与grp相同的GID或组名。如果两者一致,返回真值,否则返回假值。
-name pattern 条件表达式,检查文件名是否和模式pattern相同。pattern可以用正则表达式给出。必要时使用引号。当文件名与pattern一致时.返回真值.否则为假。
-type t 条件表达式,检查当前文件的类型是否是t。对目录讲,t值可以是d。对普通文件讲,t值可以是f,对连接讲,t值可以是l等等。如果当前的文件的类型是t,返回真值,否则为假。
-user usr 条件表达式,检查当前的文件的所有者或UID是否是usr。如果两者一致,返回真值,否则为假。
-exec cmd 操作表达式,用来执行cmd命令。如果要将当前的文件名传送给命令,应该加{}标记,分号用来表示cmd的结束,并和后面可能出现的表达式分开。如果成功地执行了cmd命令,返回真值,否则为假。
-print 操作表达式,将当前的文件名送到标准输出设备显示,返回值常为真。
-mtime   -n +n                #按文件更改时间来查找文件,-n指n天以内,+n指n天以前  
-ctime    -n +n              #按文件创建时间来查找文件,-n指n天以内,+n指n天以前  同理:
-mmin    -n                   #n天以内更改时间

2、举例
(1)/usr/lib    # find . -name 'bin*'  (等同于# find . -name 'bin*' -print)
./initramfs-tools/bin
./guile-1.8/bin
./firefox/distribution/searchplugins/locale/en-US/bing.xml
./firefox/distribution/searchplugins/locale/zh-CN/bing.xml
./firefox/distribution/searchplugins/locale/en-GB/bing.xml
./firefox/distribution/searchplugins/locale/en-ZA/bing.xml
./pm-utils/bin
./klibc/bin
./ure/lib/binaryurp.uno.so
./ure/bin
./thunderbird/distribution/searchplugins/locale/en-US/bing.xml
./python2.7/binhex.pyc
./python2.7/binhex.py

(2)# find . -name 'bin*' -type d -print ( 先通过文件名称进行过滤,再通过文件类型进行过滤
./initramfs-tools/bin
./guile-1.8/bin
./pm-utils/bin
./klibc/bin
./ure/bin

(3)# find . -name '*.bak' -type f -exec rm {} \; -print  (-exec执行cmd命令,{}表示将当前文件作为传送命令 \;表示rm的 结束
注意:{}后要“空格”并输入"\;",否则出错
下面打印出删除的信息:
./test3.bak
./test.bak
./test2.bak


三、find逻辑表达式
逻辑表达式 描述
e1 -a e2 仅当e1为真时,对e2求值
e1 e2 同上
e1 -o e2 仅当e1为假时,对e2求值
e1,e2 对两个表达式都求值,先e1,后e2
!e1 当e1为假时结果为真,反过来也一样
(1)当前目录下有a.bak b.bak
# find . -name '*.bak' -type f -exec echo {} \; -print
./a.bak
./a.bak
./b.bak
./b.bak



四、find示例
1、查找当前目录下的linux文件夹中包含有名为“ a” 文件中,存在”b“字符的行号
# find ./linux/ -name a | xargs grep -n "b"
./linux/a:1:aaabbb
./linux/test/a:1:aaabbb

2、其他
find . -user root -print
find . -type f -mtime -4 –print (列出最近四天内修改过的文件)
find . -size +5000k -exec ls -lh {} \; (将大于5000k的文件打印出来)
find . \( -name  "[Aa]*" -o -name "*[Aa]" \)  -print (打印以Aa开头或以Aa结尾的文件


五、思考
1、统计在/etc/为起点的目录树中,包含字符串“telnet”,(不区分大小写)的文件的数目。请写出这条命令?
(1)方法一:用-exec
第一步:
# find /etc/ -type f -exec grep -il "telnet" {} \;
/etc/bash_completion
/etc/bash_completion.d/qemu
/etc/services
第二步:
# find /etc/ -type f -exec grep -il "telnet" {} \; | wc -l
3

(2)方法二:用管道
# find /etc/ -type f |  grep -il "telnet" (错误,表示文件名称是否包含telnet
# find /etc/ -type f | xargs grep -il "telnet"
/etc/bash_completion
/etc/bash_completion.d/qemu
/etc/services
# find /etc/ -type f | xargs grep -il "telnet" | wc -l
3

2、文件中是否含有字符串?
可以用$ strings 命令


你可能感兴趣的:(linux)