从零开始学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 命令

相关内容

    暂无相关文章