06、Linux 教程:文件搜索、查找与对比

文件搜索、查找与对比

文件搜索命令find

find文件搜索命令。基本模式是find [搜索范围] [筛选条件],如find /etc -name *init*代表查找etc目录下文件名含init的文件,?代表单个字符,*代表任意字符,如果匹配条件不带通配符,那么搜索结果中文件名就只能是init。-iname代表不区分大小写;

-size可以在筛选条件里加入大小,find /etc -size +204800表示在etc目录下查找大于100MB的文件,+表示大于,-表示小于,数字前不加符号表示等于,这个数字的单位是数据块,等于0.5K;

-user 后加用户名,可以查找所有者为该用户的文件,-uid可以用账号id查找该账号的文件,-gid查找对应组ID的文件。

搜寻系统中不属于任何人的文件:find / -nouser,当一个用户创建了一些文件,后来该用户被删除后系统就会残留一部分这样的文件。-nogroup可以找无群组的文件。

-amin表示查找访问时间(access)、-cmin表示查找文件属性修改时间(change)、-mmin表示查找文件内容修改时间(modify),如find /etc -cmin -5表示查找etc目录下修改属性时间在5分钟以内的文件,时间前也可以有加号或者减号。

-a提供并列筛选,-o表示满足一个筛选条件即可,这两个都是放在筛选条件之间的,如find /etc -size +163840 -a -size -204800表示查找大小在两者之间的文件;

-type可以根据文件类型查找,文件类型有f、d、l等;

-inum可以根据inode查找,可以用这个命令查找一个文件的所有硬链接文件。

-perm后接数字可以查找权限为该数字的文件,此时数字前加-代表查找任何权限囊括该数字对应权限的文件(如搜-rwxr--r--,当文件为-rwxr-xr-x也会被搜出来),数字前加/表示当任何一部分数字权限能对的上时,就会被找出(如搜-rwxr-xr-x,当文件为-rw-------也会被搜出)

-exec或者-ok可以对查找结果执行命令,如:

find . -name *init* -exec ls -l {} /;

表示对当前目录下查找复合要求的文件名,然后显示结果文件详细信息,后三个字符是固定的。-ok和-exec区别在于-ok会进一步询问。

find . -inum 31531 -exec rm {} /;

表示对查找结果进行删除。

上述执行格式中大括号代表find命令执行的结果,而/;或;代表分号,是命令的终止符,而大括号到-exec这段就是find后要执行的命令。

查看24小时内更新过的文件:find / mtime 0

找到比后一个文件更新的文件:find /etc -newer /etc/passwd

文件搜索命令locate

locate也是文件搜索命令,后面直接加文件名,表示查找含有该名的文件,这个命令查找速度非常快,这是因为linux预先建立了一个数据库记录了文件信息,locate就是通过查找该库来寻找文件的,这个数据库在/var/lib/mlocate/mlocate.db。缺点是新建的文件没有被收录进这个数据库,此时用locate命令是查不到的,但是可以用updatedb来手动刷新资料库,但是如果把文件放在tmp(临时目录)下,即使刷新过该命令也无法找到。locate可以加-i选项,此时查找不区分大小写。

找到与passwd相关的文件,只列出5个:locate -l 5 passwd

查找文件内容grep

grep可以用来查找文件内容,如grep winner /etc/inittab表示查找文件中是否有winner字符串,并显示有该字符串的行。-i可以不区分大小写查找。-v可以过滤掉某些结果,如:

grep -v ^# /etc/inittab

表示过滤掉以#开头的行,只显示其他行。

取出所有没有root的行:last | grep -v 'root'

grep命令其实是分析每一行,将符合要求的行取出。

文件对比命令

比较两个目录内的文件差异:diff -r 目录1 目录2

diff和cmp命令是对比两个文件之间的差异的,前者以行为单位对比,后者以字节为单位对比。

patch命令可以配合diff使用,diff命令制作旧文档到新文档的补丁,patch命令可以给旧文档升级到新文档,也可以恢复原来的文档版本。