4.4 查找操作命令
使用目录结构最大的好处就是可以将不同的文件进行分类,方便使用。但是无论目录规划得多好,总会有不知道要使用的文件存在什么地方的问题,这时就需要使用查找工作找到自己需要的文件。下面是在Linux中常用的一些与查找相关的命令。
4.4.1 locate:查找文件或目录
locate命令用于查找文件或目录,该命令语法如下。
locate查找内容
常用指数:
locate命令用于查找文件或目录,该命令只会在保存文件和目录名称的数据库中查找符合条件的内容。在查找内容中使用“*”表示任意个字符;使用“?”表示任何一个字符。比如查找内容为“tony*zhang”,locate命令会查找所有以“tony”开始并且以“zhang”结尾的文件和目录。如果有目录的名称叫“tony_zhang”则会显示出该目录下包括子目录在内的所有文件。locate命令并不特别看待“/”、“.”为特殊符号,名为“tony.zhang”的文件或路径名“tony/zhang”也符合查找条件。
locate命令查找的速度非常快,这是因为该命令并不是实际在硬盘中每个目录去查找文件,而是在一个保存了硬盘上目录结构及文件名的数据库中查找,也是因为这个原因对于刚新增、修改、删除的文件和目录,locate命令有可能无法找到,这时需要使用如下命令更新数据库。在有些Linux发行版中系统会定期执行该命令。
[root@srv ~]# updatedb
下面看几个locate命令的例子。
● 查找名为grub的文件或目录。
[root@srv ~]# locate grub
● 查找名称中包括“charles”的文件或目录。
[root@srv ~]# locate *charles*
4.4.2 which:查找文件
which命令用于查找文件,该命令语法如下。
which [文件]
常用指数:
which命令用于查找文件,但该命令只会在PATH环境变量中定义的路径及命令别名中查找。下面看几个which命令的例子。
● 显示PAT H环境变量中定义的路径。
[root@srv ~]# echo $PATH /usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr /sbin:/usr/bin:/root/bin
● 在PAT H环境变量中定义的路径及命令别名中查找“l l”。
[root@srv ~]# which ll
alias ll='ls -l --color=tty'
/bin/ls
4.4.3 whereis:查找文件
whereis命令用于查找文件,该命令语法如下。
whereis [-bu] [-B <目录>] [-M <目录>] [-S <目录>] [文件…]
常用指数:
常用选项:
● 文件…:要查找的文件。
● -b:只查找二进制文件。
● -u:查找不包含指定类型的文件。
● -B<目录>:只在指定的目录下查找二进制文件。
● -M<目录>:只在指定的目录下查找帮助文件。
● -S<目录>:只在指定的目录下查找源码文件。
whereis命令只在特定的目录中查找符合条件的文件,查找的文件类型会属于源码文件、二进制文件或帮助文件。如果不指定目录,whereis命令会在下列目录中查找。
● /bin
● /etc
● /sbin
● /usr/bin
● /usr/etc
● /usr/games
● /usr/include
● /usr/lib
● /usr/local
● /usr/man
● /usr/sbin
● /usr/src
● /usr/local/bin
● /usr/local/etc
● /usr/local/games
● /usr/local/lib
● /usr/local/man
●
下面看几个whereis命令的例子。
● 查找grub及其帮助文件所在的目录。
[root@srv ~]# whereis grub
grub: /sbin/grub /etc/grub.conf /usr/share/grub /usr/share/man/man8/grub.8.gz
● 查找grub帮助文件所在的目录。
[root@srv ~]# whereis -m grub
grub: /usr/share/man/man8/grub.8.gz
4.4.4 find:查找文件或目录
find命令用于查找文件或目录,该命令语法如下。
find [目录…] [-amin <分钟>] [-anewer <参数文件>] [-atime <24小时数>] [-cmin <分钟>] [-cnewer <参数文件>] [-ctime<24小时数>][-depth] [-empty][-exec<执行命令>][-fls<列表文件>][-follow] [-fstype <系统文件类型>] [-gid <组编号>] [-group <组名称>] [-nogroup] [-mmin <分钟>] [-mtime <24小时数>] [-name <查找内容>] [-nogroup] [-nouser] [-perm <权限数值>] [-size <文件大小>] [-uid <用户编号>] [-user <用户名称>] [-nouser]
常用指数:
常用选项:
● 目录…:查找指定目录的内容,如果不指定目录则查找当前目录。
● -amin <分钟>:查找在指定时间曾被访问过的文件或目录,单位以分钟计算。如指定为“10”,find命令会查找刚好在10 分钟之前被访问过的文件或目录;配置为“+10”,find命令会查找10分钟以前被访问过的文件或目录;配置为“-10”,find命令会查找在10分钟以内被访问过的文件或目录。
● -anewer <参数文件>:查找访问时间比指定文件或目录的访问时间更接近现在的文件或目录。
● -atime <24小时数>:查找在指定时间曾访问过的文件或目录,单位以24小时计算。如配置为2,find命令会查找刚好在48小时之前访问过的文件;配置为+2,find命令会查找超过在48小时之前访问过的文件;配置为-2,find命令会查找在48小时之内访问过的文件。
● -cmin <分钟>:查找在指定时间曾被更改过权限属性的文件或目录,单位以分钟计算。如指定为“10”,find命令会查找刚好在10分钟之前被更改过权限属性的文件或目录;配置为“+10”,find命令会查找10分钟以前被更改过权限属性的文件或目录;配置为“-10”,find命令会查找在10分钟以内被更改过权限属性的文件或目录。
● -cnewer <参数文件>:查找更改时间比指定文件或目录的访问时间更接近现在的文件或目录。
● -ctime <24 小时数>:查找在指定时间曾更改过权限属性的文件或目录,单位以24小时计算。比如配置为2,find命令会查找刚好在48小时之前更改过权限属性的文件;配置为+2,find命令会查找超过在48小时之前更改过权限属性的文件;配置为-2,find命令会查找在48小时之内更改过权限属性的文件。
● -depth:从指定目录下最深层的子目录开始查找。
● -empty:查找文件大小为0字节的文件,或目录下没有任何子目录或文件的空目录。
● -exec<执行命令>:对找到的文件或目录执行Shell命令。
● -fls<列表文件>:把查找结果保存为指定的列表文件。
● -follow:查找时排除符号链接文件。
● -fstype <系统文件类型>:只查找该文件系统类型下的文件或目录。文件系统类型可以是:“adfs”(Advanced Disk File System)、“affs”(Amiga Fast File System)、“hfs”(Macintosh Filesystem)、“fat”(DOS File Allocation Table)、“msdos”、“umsdos”(UNIX-Like MS-DOS)、“vfat”(Virtual File System)、“hpfs”(High Performace File System)、“qnx4”(QNX filesystem)、“ext2”(Second Extended Filesystem)、“sysv”(System V Filesystem)、“ufs”(UNIX File System)、“efs”(IRIX File System)。
● -gid <组编号>:查找拥有组是符合指定用户组条件的文件或目录。如配置为500,find命令会查找组编号为500的文件或目录;配置为+500,find命令会查找组编号大于500的文件或目录;配置为-500,find命令会查找组编号小于500的文件或目录。
● -group<组名称>:查找拥有组是指定用户组的文件或目录,也能以组编号指定。
● -nogroup:查找拥有组不是“/etc/group”文件中存在的用户组的文件或目录。
● -mmin <分钟>:查找在指定时间曾被更改过内容的文件或目录,单位以分钟计算。如指定为“10”,find命令会查找刚好在10分钟之前被更改过内容的文件或目录;配置为“+10”,find命令会查找在10分钟以前被更改过内容的文件或目录;配置为“-10”,find命令会查找在10分钟以内被更改过内容的文件或目录。
● -mtime <24小时数>:查找在指定时间曾更改过内容的文件或目录,单位以24小时计算。如配置为2,find命令会查找刚好在48小时之前更改过内容的文件;配置为+2,find命令会查找超过在48小时之前更改过内容的文件;配置为-2,find命令会查找在48小时之内更改过内容的文件。
● -name <查找内容>:查找指定的内容,在查找内容中使用“*”表示任意个字符;使用“?”表示任何一个字符。如查找内容为“tony*zhang”,locate命令会查找所有以“tony”开始并且以“zhang”结尾的文件和目录。但文件或目录名前面的“.”并不会并处理,比如“*charles*”并不会找到“.charles”的内容。
● -perm <权限数值>:查找符合指定权限数值(有关权限数值见第6章)的文件或目录。如配置为“0700”,find命令会查找权限数值正好是“0700”的文件或目录;配置为“+0700”,find命令会查找权限数值大于 “0700”的文件或目录;配置为“-0700”,find命令会查找权限数值小于“0700”的文件或目录。
● -size <文件大小>:查找符合指定大小的文件。文件大小单位可以是“c”表示Byte;“k”表示KB。如配置为“100k”,find命令会查找文件大小正好100KB的文件;配置为“+100k”,find命令会查找文件大小大于100KB的文件;配置为“-100k”,find命令会查找文件大小小于100KB的文件。
● -uid <用户编号>:查找所有者是符合指定用户条件的文件或目录。如配置为500,find命令会查找用户编号为500的文件或目录;配置为+500,find命令会查找用户编号大于500的文件或目录;配置为-500,find命令会查找用户编号小于500的文件或目录。
● -user<用户名称>:查找所有者是指定用户的文件或目录,也能以用户编号指定。
● -nouser:查找所有者不是“/etc/passwd”文件中存在的用户的文件或目录。
find命令用于查找符合条件的文件或目录,但find命令并不像local命令只在数据库中查找,也不像which和whereis命令只在特定的目录中查找,find可以在本机任何目录实时地查找,虽然find命令没有local命令执行速度快,但find在硬盘查找不会出现文件或目录已存在但无法找到的情况。其中“-exec <执行命令>”选项可以对查找到的内容执行其他的Shell命令,格式如下,必须以“\;”结尾,“{}”可以表示找到的内容。
find -exec <执行命令> \;
下面看几个find命令的例子。
● 列出当前目录下所有子目录及文件的名称。
[root@srv ~]# find ./.bash_history
● 查找当前目录及其子目录下以“D”开头的文件或目录。
[root@srv ~]# find -name D*
Desktop
● 查找当前目录及其子目录下以“D”或“M”开头的文件或目录,“-o”表示前后两个条件中满足一个就显示。
[root@srv ~]# find -name D* -o -name M*
./.MultiGet/MultiGet-1.1.2-linux.tar.gz.mgidx
./Desktop
● 查找“/share”目录及其子目录中文件系统为“vfat”并且名称为“jack.docx”的文件。
[root@srv ~]# find /share jack.docx -fstype vfat
● 查找“/share”目录及其子目录中文件系统不是“vfat”并且名称为“jack.docx”的文件,“!”表示不能符合后面所指定的条件。
[root@srv ~]# find /share jack.docx ! -fstype vfat
● 查找根目录及其子目录中所有大于10M的文件。
[root@srv ~]# find / -size +10M
● 查找“/boot”目录及其子目录中所有以“.conf”结尾的文件,并把这些文件复制到/tmp目录。
[root@srv ~]# find /boot -name *.conf -exec cp {} /tmp \;