Linux中常见的文件查询命令有5个
which
:在PATH变量指定的路径中,搜索某个系统命令的位置,并且返回第一个搜索结果;
type
:用于区分某个命令到底是由shell自带的,还是由shell外部的独立二进制文件提供的。如果一个命令是外部命令,那么使用-p参数,会显示该命令的路径,相当于which
命令。type
命令其实不能算查找命令;
whereis
:只能用于程序名的搜索,而且只搜索二进制文件(参数-b)、man说明文件(参数-m)和源代码文件(参数-s);
locate
:相当于find -name
,可快速查找文件;
find
:最常用和最强大的查找命令,可以用它找到任何想找的文件。
注意:
通常find
不很常用,因为速度慢!
常都是先使用whereis
或者locate
来检查,当真的找不到了,才用find查找。
是因为whereis
与locate
是利用数据库来查找数据,所以相当快速,而且没有实际查询硬盘,比较节省时间。
whereis
和locate
寻找的数据是由已创建的数据 /var/lib/
中查找。但是数据库的更新默认是每天更新一次(不同系统可能会有差异),所以当新建文件或删除文件后去查找该文件,whereis
和locate
会告诉你文件“not found”,因为必须更新数据库了。
要手动更新数据库的方法也很简单,直接输入updatedb
即可。updatedb
命令回去读取/etc/updatedb.conf中的配置,然后去硬盘里面进行查找文件名操作,最后更新整个数据库文件。
[root @localhost ~]#which [-a] command 参数解析: -a:将所有由PATH目录中可以找到的目录均列出来
[root@localhost Test]# which ifconfig /sbin/ifconfig [root@localhost Test]# su - rhx [rhx@localhost ~]$ which ifxonfig /usr/bin/which: no ifxonfig in (/usr/lib/qt-3.3/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/rhx/bin)
为什么会显示不存在呢?这是因为which根据用户所设置的PATH变量内的目录去查找可执行文件,所以不同的用户所设置的PATH设置内容就不一样了。
2、whereis文件查找时优先使用where和locate命令,当找不到的时候才会使用find,因为find命令查找速度较慢,因为find命令直接查找硬盘,而whereis命令使用的查找方式不同,Linux将系统内的所有文件都记录在一个数据库文件中,使用whereis 或者locate 命令会以此数据库进行查找,但是如果数据库没有更新,则会出现新建文件查询不到的情况发生
[root @localhost ~]#where [-bmsu] command 参数解析: -b :只查找二进制格式的文件 -m :只查找在说明文件manual路径下的文件 -s :只查找source文件 -u :查找不在上述三个选项当中的其他特殊文件
[root@localhost rhx]# whereis ifconfig ifconfig: /sbin/ifconfig /usr/share/man/man8/ifconfig.8.gz [root@localhost rhx]# su - rhx [rhx@localhost ~]$ whereis ifconfig ifconfig: /sbin/ifconfig /usr/share/man/man8/ifconfig.8.gz
发现whcih命令一般普通用户找不到的ifoncifg,使用whereis 命令可以找到,这是因为系统中存在ifconfig这个文件,但是普通用户的PATH中并没有加入到/sbin
3、locate[root @localhost ~]#locate [-ir] command 参数解析: -i :忽略大小写 -r :后面可接正则表达式的显示方式
注意:whereis 和 locate 命令查找的数据是由 创建的数据库/var/lib/mlocate/里面的数据所查找的
但是数据库的更新是一天/次,因此在未更新之前,找不到新建的文件,通过手动进行更新
[root@localhost ~]# updatedb
updatedb 命令回去读取/etc/updatedb.conf 这个文件的设置,然后再去硬盘里进行查找文件名的操作,接着进行文件整个数据库文件的更新
4、findfind命令的工作方式如下:沿着文件层次结构向下遍历,匹配符合条件的文件,执行相应find命令的工作方式如下:沿着文件层次结构向下遍历,匹配符合条件的文件,执行相应的操作。下面来看看find命令的各种应用场景和基本用法。
[root @localhost ~]#find[PATH] [option] [option] [action]
[root@localhost ~]# find . print
.指定当前目录,.. 指定父目录。这是Unix文件系统中的约定用法。
-print指明打印出匹配文件的文件名(路径)。当使用 -print时,'\n'作为用于对输出的文件名进行分隔。就算你忽略-print,find命令仍会打印出文件名。-print0指明使用'\0'作为匹配的文件名之间的定界符。当文件名中包含换行符时,这个方法就有用武之地了。find 非常强大,下面一一介绍
选项–name的参数指定了文件名所必须匹配的字符串。我们可以将通配符作为参数使用。*.txt能够匹配所有以.txt结尾的文件名。选项 -print在终端中打印出符合条件(例如 -name)的文件名或文件路径,这些匹配条件通过find命令的选项给出。
[root@localhost Test]# find /home/ -name "*.txt" -print /home/rhx/Test/tmp.txt
find命令有一个选项 -iname(忽略字母大小写),该选项的作用和 -name类似,只不过在匹配名字时会忽略大小写
.如果想匹配多个条件中的一个,可以采用OR条件操作
[rhx@localhost Test]$ find . \( -name "*.txt" -o -name "*.sh" \) -print
\(以及\)使用转义,将 -name "*.txt" -o -name "*.pdf"视为一个整体
选项-path的参数可以使用通配符来匹配文件路径。-name总是用给定的文件名进行匹配。-path则将文件路径作为一个整体进行匹配。
[rhx@localhost Test]$ find /home -path "*/slynux/*" -print
正则表达式是通配符匹配的高级形式,它可以指定文本模式。我们借助这种模式来匹配文本及进行打印。使用正则表达式进行文本匹配的一个典型例子就是从一堆文本中解析出所有的E-mail地址。E-mail地址通常采用name@host.root这种形式,所以可以将其一般化为[a-z0-9]+@[a-z0-9]+.[a-z0-9]+。符号+ 指明在它之前的字符类中的字符可以出现一次或多次。
[rhx@localhost Test]$ find . ! -name "*.txt" -print . ./SleepingProgram.sh ./1.3.2.sh ./save ./save/SleepingProgram.sh ./save/DEBUG.sh ./save/ProgramRunningTime.sh ./ProgramRunningTime.sh ./sh1.3.sh ./1.11.1.sh ./arr.sh ./CharacterSeparator.sh ./Func.sh
find命令在使用时会遍历所有的子目录。可以采用深度选项-maxdepth和 -mindepth来限制find命令遍历的目录深度。大多数情况下,只需要在当前目录中进行搜索,无须再继续向下查找。对于这种情况,使用深度选项来限制find命令向下查找的深度。如果只允许find在当前目录中查找,深度可以设置为1;当需要向下两级时,深度可以设置为2;其他情况可以依次类推。可以用-maxzdepth指定最大深度。与此相似,也可以指定一个最小的深度,告诉find应该从此处开始向下查找。如果想从第二级目录开始搜索,那么就使用 -mindepth设置最小深度。使用下列命令将find命令向下的最大深度限制为1:
[rhx@localhost Test]$ find . -maxdepth 1 -name "s*" -print
该命令列出当前目录下的所有文件名以s打头的文件。即使有子目录,也不会被打印或遍历。与之类似,-maxdepth 2最多向下遍历两级子目录。-mindepth类似于 -maxdepth,不过它设置的是find开始遍历的最小深度。这个选项可以用来查找并打印那些距离起始路径一定深度的所有文件。例如,打印出深度距离当前目录至少两个子目录的所有文件:
[rhx@localhost Test]$ find . -mindepth 2 -name "s*" -print
Unix类系统将一切都视为文件。文件具有不同的类型,例如普通文件、目录、字符设备、块设备、符号链接、硬链接、套接字以及FIFO等。
-type可以对文件搜索进行过滤。借助这个选项,我们可以为find命令指明特定的文件匹配类型。
[rhx@localhost Test]$ find . -type d -print . ./save
Linux系统下,每一个文件都有三个时间戳,分别是atime,ctime,mtime
atime:访问时间,用户最近一次访问该文件的时间
ctime:文件属性(权限,所有者)最后一次变换的时间
mtime:修改时间,文件内容最后一次被修改的时间
三个时间中以mtime使用较多,这就mtime进行讲解,其他的相同
-mtime n:n为数字表示n天前的那一天被修改的文件,注意 0 表示24小时之内修改内容的文件
-mtime +n: 列出在n天之前(不包含n本身)被更改的文件名
-mtime -n: 列出n天之内(不包含n本身)被更改多的文件名
-newer file:file 是一个已经存在的文件,列出比 file 文件还要新的文件名
[rhx@localhost Test]$ find . -mtime 0 . ./SleepingProgram.sh ./1.3.2.sh ./test.txt ./exam.txt ./save ./save/SleepingProgram.sh ./save/DEBUG.sh ./save/ProgramRunningTime.sh ./ProgramRunningTime.sh ./sh1.3.sh ./1.11.1.sh ./arr.sh ./CharacterSeparator.sh ./Func.sh ./tmp.txt
根据文件大小进行文件筛选
[rhx@localhost Test]$ find . -type f -size +2k #大于2k [rhx@localhost Test]$ find . -type f -size -2k #小于2k [rhx@localhost Test]$ find . -type f -size 2k #等于2k
-uid n : n为数字,这个数字是用户的账号ID,即是UID,这个UID记录在/etc/passwd中与账号名称对应的数字 -gid n: n为数字,这个数字是用户组名的ID,即是GID,这个GID记录在/etc/group -user name :name 为用户名,如 root用户,普通用户 rhx -nouser :寻找文件的所有者不存在 /etc/passwd 中 -nogroup :寻找文件的用户组不在/etc/group在的文件 [rhx@localhost Test]$find /home -user rhx #找出用户在系统中的所有文件,很常用 [rhx@localhost Test]$find /home -nouser #找出不属于任何人的文件
-perm mode:查找文件权限等于mode的文件 [rhx@localhost Test]$find . -type f -name "s*" ! -perm 777 -print
-exec command:其中command为其他的命令,-exec 后面可以再接其他命令来处理查找的结果 -print :将结果打印到屏幕上这个操作时默认的操作,因此不写也会打印在屏幕上
[rhx@localhost ~]$ find . -type f -size -2k -exec ls -l {} \;
该语法较为特殊,这里一一解析:
{} 表示由 find 查找的内容,其结果会放置在 {} 中
-exec ls -l {} \;是关键字,表示 find 其他命令的开始(-exec)一直到结束( \; ),这中间就是其他