liunux中文件查找的方法


我们经常在linux要查找某个文件,但不知道放在哪里了,可以使用下面的一些命令来搜索。这些是从网上找到的资料,因为有时很长时间不会用到,当要用的时候经常弄混了,所以放到这里方便使用。

常用的查找命令有:
which 查看可执行文件的位置
whereis 查看文件的位置
locate 配合数据库查看文件位置
find 实际搜寻硬盘查询文件名称


 一、which 
语法:
[root@redhat ~]# which 可执行文件名称
例如:
[root@redhat ~]# which passwd
/usr/bin/passwd

我们知道在命令行当中,连续输入两次tab键就能够知道用户有多少命令可以下达。那你知不知道这些命令的完整文件名放在哪里?which和type可以帮助你找到执行档的信息。这个指令是根据PATH这个环境变量所定义的路径去搜寻执行文件,所以,重点是找出执行档文件而已!which加-a选项是将所有由PATH目录中可以找到的指令均列出,而不止第一个被找到的指令名称,则可以列出所有的可以找到的同名执行文件,而非仅显示第一个而已!有一个范例最有趣,怎么cd这个常用的命令竟然找不到,为什么呢?这是因为cd是bash内建的指令,但是which预设是找PATH内定义的目录,所以当然找不到的!那怎么办呢?我们可以用type命令查找!

二、whereis 
语法:
[root@redhat ~]# whereis [-bmsu] 文件或者目录名称
参数说 明:
-b : 只找二进制文件
-m: 只找在说明文件manual路径下的文件
-s : 只找source源文件
-u : 没有说明文档的文件
例如:
[root@redhat ~]# whereis passwd
passwd: /usr/bin/passwd /etc/passwd /usr/share/man/man1/passwd.1.gz /usr/share/man/man5/passwd.5.gz
将和passwd文件相关的文件都查找出来

[root@redhat ~]# whereis -b passwd
passwd: /usr/bin/passwd /etc/passwd
只将二进制文件 查找出来



 三、 locate 
语法:
[root@redhat ~]# locate 文件或者目录名称
例 如:
[root@redhat ~]# locate passwd
/home/weblogic/bea/user_projects/domains/zhanggongzhe112/myserver/stage/_appsdir_DB_war/DB.war/jsp/as/user/passwd.jsp
/home/weblogic/bea/user_projects/domains/zhanggongzhe112/myserver/stage/_appsdir_admin_war/admin.war/jsp/platform/passwd.jsp
/lib/security/pam_unix_passwd.so
/lib/security/pam_passwdqc.so
/usr/include/rpcsvc/yppasswd.x
/usr/include/rpcsvc/yppasswd.h
/usr/lib/perl5/5.8.5/i386-linux-thread-multi/rpcsvc/yppasswd.ph
/usr/lib/kde3/kded_kpasswdserver.la
/usr/lib/kde3/kded_kpasswdserver.so
/usr/lib/ruby/1.8/webrick/httpauth/htpasswd.rb
/usr/bin/vncpasswd
/usr/bin/userpasswd
/usr/bin/yppasswd
…………


和find相比,whereis查找的速度非常快,这是因为linux系统会将系统内的所有文件都记录在一个数据库文件中,当使用whereis和下面即将介绍的locate时,会从数据库中查找数据,而不是像find命令那样,通过遍历硬盘来查找,效率自然会很高。但是该数据库文件并不是实时更新,默认情况下时一星期更新一次,因此,我们在用whereis和locate查找文件时,有时会找到已经被删除的数据,或者刚刚建立文件,却无法查找到,原因就是因为数据库文件没有被更新。在Linux底下也有相当优异的搜索指令!通常find不很常用的!因为速度慢之外,也会产生很多硬盘的I/O操作!通常我们都是先使用whereis或者是locate来查找,如果真的找不到了,才以find来查找!为什么呢?因为whereis与locate是利用数据库来查找数据,所以相当的快速,而且并没有实际的搜寻硬盘,比较省时间。这个locate的使用更简单,直接在后面输入要索的文件名称,就能够得到结果。上面的例子来说,我输入locatepasswd,那么在完整文件名(包含路径名称)当中,只要有passwd在其中,就会被显示出来!如果你忘记某个档案的完整档名时,这也是个很方便好用的命令,但是,这个东西还是有使用上的限制的,为什么呢?你会发现使用locate时会有限制的因为/var/lib/mlocate,就是文件数据库更新不会很及时。


locate:
非实时,模糊匹配,查找是根据全系统文件数据库进行的;
FC4的系统上默认是一天更新一次数据库
# updatedb, 手动生成文件数据库
速度快

find:
实时
精确
支持众多查找标准
遍历指定目录中的所有文件完成查找,速度慢;


查找路径:默认为当前目录
查找标准:默认为指定路径下的所有文件
处理运作:默认为显示




四、find

1、find命令的一般形式为;


find 查找路径 查找标准 查找到以后的处理运作
find pathname -options [ -exec -ok ...]

2、find命令的参数;

pathname: find命令所查找的目录路径。例如用.来表示当前目录,用/来表示系统根目录。
-print: find命令将匹配的文件输出到标准输出。
-exec: find命令对匹配的文件执行该参数所给出的shell命令。相应命令的形式为'command' { } \;,注意{ }和\;之间的空格。
-ok: 和-exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行。

3、find命令选项

-name :按照文件名查找文件
For example:在/etc目录下查找文件名passwd的文件
# find /etc -name 'passwd'
-iname:按照文件名查找文件,且不区分大小写
For example:在/etc目录下查找文件名passwd的文件
# find /etc -iname 'passwd'

-user:按照文件属主来查找文件
For example:在/tmp目录下查找属主为hdoop的文件或目录
# find /etc -user hdoop

-group :按照文件所属的组来查找文件
For example:在/tmp目录下查找属组为hbase的文件或目录
# find /tmp -group hbase

-uid:UID:当某个用户被删除,用户所属的文件UID没有被删除,在这个情况下就可以使用此选项
For example:用户hdoop的UID为600,如果将hdoop用户删除,那如何在/tmp查找文件或目录的属主为hdoop以前的文件呢
# find /tmp -uid 600

-gid:GID:当某个组被删除,用户所属的文件GID没有被删除,在这个情况下就可以使用此选项
For example:组hbase的GIDD为666,如果将hbase组删除,那如何在/tmp查找文件或目录的属组为hbase以前的文件呢
# find /tmp -gid 666


-nouser:查找没有有效所属主的文件,即该文件所属的主在/etc/passwd中不存在
For example:查找/tmp目录没有属主的文件
# find /tmp -nouser

-nogrouop:查找没有有效所属组的文件,即该文件所属的组在/etc/groups中不存在。
# find /tmp -nogroup

-type:以文件类型查找文件
在Linux文件系统中常用到的文件类型有:
b:块设备文件
d:目录
c:字符设备文件
p:管道文件
l:符号链接文件
f:普通文件
s:套接字设备文件
p:管道设备文件
For example:查找/tmp目录下所有普通文件
# find /tmp -type f

-size: [+|-]文件大小查找文件
默认单位是字节,当我们去找10M的文件时,所有9点几兆的文件都满足条件。
#k:(#代表数字)
#M:(#代表数字)
#G:(#代表数字)
For example:查找/tmp目录下文件大小为10MB的文件
# find /tmp -size 10M
组合条件:
-a:与条件
-o:或条件
-not:非条件
For example:查找/tmp目录下没有属主并且类型为目录的文件
# find /tmp -nouser -a -type d -ls
假如把-a换成-o选项:则说明没有属主或是目录文件,两个选项满足一个即可。
# find /tmp -not -type d
说明在/tmp目录查找非目录类型的文件
查找/tmp目录下,非目录类型,并且还不是套接字类型的文件
# find /tmp -not -type d -a -not -type s
# find /tmp -not \( -type -d -o -type -s \)
两者都可以实现目的:

根据时间戳查找符合的文件:

-ctime [+/-]n:查找系统中最后n天被改变文件状态的文件(单位:天)
+5:至少有五天没有访问过
-5:五天内被访问过
5:如果不加[+/-]:刚好五天被放过
-atime [+/-]n:查找系统中最后n天被访问的文件(单位:天)
同上解释:
-mtime [+/-]n:查找系统中最后n天小时被改变文件数据的文件(单位:天)



-cmin [+/-]n:查找系统中最后N分钟被改变文件状态的文件(单位:分钟)
+8:至少8分钟没有访问过的文件
-8:8分钟之内访问过的文件
8 :正好8分钟访问的文件
-amin [+/-]n:查找系统中最后N分钟访问的文件(单位:分钟)
同上解释:
-mmin [+/-]n:查找系统中最后N分钟被改变文件数据的文件(单位:分钟)
同上解释:

-perm MODE(格式为十进制格式):根据文件权限来查找文件
MODE:精确匹配
/MODE:只要有以为权限匹配即可
-MODE:文件权限完全包含此MODE时才给予显示

动作:默认动作为print,表示显示出来
-printe
-ls:类此ls -l的形式显示出每个被匹配到的文件的详细信息
-ok COMMOND {} \; 只不过每一步操作都需要用户确认是否操作
-exec COMMOND {} \; 不需要用户确认信息
当使用find命令的-exec选项处理匹配到的文件时,find命令将所有匹配到的文件一起传递给exec来执行。
For example:查找当前目录其它用户具有读执行的文件并且将其它用户写权限去掉,并显示匹配到的文件详细信息
# find ./ -perm -006 -exec chmod o-w {} \; -ls
# find ./ -perm -006 -ok chmod o-w {} \; -ls
以上两个命令都可以实现此结果
For example:查找/tmp目下属组具有写权限的文件,把源文件该为在原来的基础上后面加上.new
# find /tmp -perm -020 -exec mv {} {}.new \;即可完成
For example:在/logs目录中查找更改时间在10日以前的文件并删除它们:
# find logs -type f -mtime +10 -exec rm { } \;
注:在一次强调下动作的注意事项:
find命令在当前目录中查找所有文件名以.LOG结尾、更改时间在5日以上的文件,并删除它们,只不过在删除之前先给出提示。
# find . -name "*.conf" -mtime +5 -ok rm { } \;
按y键删除文件,按n键不删除。
所以当使用mv或者是rm的时候,记住一定要使用-ok来提示我们每一步的操作是否移动、更改、删除等信息

下面我们来用相应的实例来介绍下find相关高级用法:
1、查找/var目录下属主为root并且属组为mail的所有文件;
# find /var -user root -group mail

2、查找/usr目录下不属于root,bin,或student的文件;
# find /usr -not -user root -a -not -user bin -a -not -user student
# find /usr -not \( -user root -o -user bin -o -user student \)

3、查找/etc目录下最近一周内内容修改过且不属于root及student用户的文件;
# find /etc -mtime -7 -not \ ( -user root -o -user student \)
# find /etc -mtime -7 -not -user root -a -not -user student

4、查找当前系统上没有属主或属组且最近1天内曾被访问过的文件,并将其属主属组均修改为root;
# find / \( -nouser -o -nogroup \) -a -atime -1 -exec chown root:root {} \;

5、查找/etc目录下大于1M的文件,并将其文件名写入/tmp/etc.largefiles文件中;
# find /etc -size +1M >> /tmp/etc.largefiles

6、查找/etc目录下所有用户都没有写权限的文件,显示出其详细信息;
# find /etc -not -perm /222 -ls
7、find命令首先匹配所有文件名为“ passwd*”的文件,例如passwd、passwd.old、passwd.bak,然后执行grep命令看看在这些文件中是否存在一个hdoop用户。
# find /etc -name "passwd*" -exec grep "hdoop" { } \;
hdoop:x:501:501::/home/hdoop:/bin/bash

8、find命令将删除当目录中访问时间在7日以来、含有数字(数字为三位数)后缀的admin.log文件。
# find . -name "admin.log[0-9][0-9][0-9]" -atime -7 -ok
注:在做此题目时,自己可以创建相应地文件来进行测试