一、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命令,返回真值,否则为假。 |
操作表达式,将当前的文件名送到标准输出设备显示,返回值常为真。 |
-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 命令
版权声明:本文为博主原创文章,未经博主允许不得转载。