Linux下的查找功能

一、概论

  • find命令:根据文件的属性进行查找,如文件名、文件大小,所有者,所属组,访问时间,修改时间等
  • grep命令:根据文件的内容进行查找,会对文件的每一行按照给定的模式进行匹配查找
  • which命令:查看可执行文件的位置,只有设置了环境变量的程序才可用
  • whereis命令:寻找特定的文件,如二进制文件、源文件和man手册页
  • locate命令:配合数据库查看文件位置

一、文件查找(find)

1、格式

find [指定目录] [指定条件] [指定动作]

  • 指定目录:要搜索的目录及其所有的子目录,默认当前目录。
  • 指定条件:搜索文件的特征
  • 指定动作:搜索结果的特定处理

2、条件参数

条件参数 作用 备注
-name 匹配名称
-perm 匹配权限 mode为完全匹配,-mode为包含即可
-user 匹配所有者
-group 匹配所有组
-mtime -n +n 匹配修改内容的时间 -n指n天以内,+n指n天以前
-atime -n +n 匹配访问文件的时间 -n指n天以内,+n指n天以前
-ctime 匹配修改文件权限的时间 -n指n天以内,+n指n天以前
-nouser 匹配无所有者的文件
-nogroup 匹配无所有组的文件
-type b/d/c/p/l/f 匹配文件类型 (b)块设备、(d)目录、(c)字符设备、(p)管道、(l)链接文件、(f)文本文件
-size 匹配文件的大小 +50KB:超过50KB的文件,-50KB:小于50KB的文件
-prune 忽略某个目录

3、示例

  • 按照文件名查找
# 在根目录查找httpd.conf文件,即全盘查找
find / -name httpd.conf

# 在/etc目录下查找httpd.conf文件
find /etc -name httpd.conf

# 在当前目录下查找包含test的文件
find . -name "*test*"
  • 按照文件特征查找
// 在当前目录下查找最近48小时访问的文件
find . -atime -2

//在当前目录下查找最后十分钟访问过的文件(access time)
find . -amin -10

//在当前目录下查找为空的文件或文件夹
find . -empty

//在当前目录下查找group为gp的文件
find . -group gp

//在当前目录下查找最后5分钟里修改过的文件(modify time)
find . -mmin -5

//在当前目录下查找最后24小时修改过的文件
find . -mtime -1

//在当前目录下查找大于100字节的文件
//(c:字节、w:双字、k:KB、M:MB、G:GB)
find . -size +100c
find . -size -100M
  • 按照混合查找方式

参数:!、-and(-a)、-or(-o)

//在tmp目录下查找文件大于1000KB并且最近2分钟修改点文件
find /tmp -size +1000KB -and -mtime +2

//在根目录下查找用户为u1或u2的文件
find / -user u1 -or -user u2

//在tmp目录下查找所有不属于u1用户的文件
find /tmp ! -user u1
  • 帮助文档
[11:45@zhouchao ~/xg205_application/user205]$find --help
Usage: find [-H] [-L] [-P] [-Olevel] [-D debugopts] [path...] [expression]

default path is the current directory; default expression is -print
expression may consist of: operators, options, tests, and actions:
operators (decreasing precedence; -and is implicit where no others are given):
      ( EXPR )   ! EXPR   -not EXPR   EXPR1 -a EXPR2   EXPR1 -and EXPR2
      EXPR1 -o EXPR2   EXPR1 -or EXPR2   EXPR1 , EXPR2
positional options (always true): -daystart -follow -regextype

normal options (always true, specified before other expressions):
      -depth --help -maxdepth LEVELS -mindepth LEVELS -mount -noleaf
      --version -xdev -ignore_readdir_race -noignore_readdir_race
tests (N can be +N or -N or N): -amin N -anewer FILE -atime N -cmin N
      -cnewer FILE -ctime N -empty -false -fstype TYPE -gid N -group NAME
      -ilname PATTERN -iname PATTERN -inum N -iwholename PATTERN -iregex PATTERN
      -links N -lname PATTERN -mmin N -mtime N -name PATTERN -newer FILE
      -nouser -nogroup -path PATTERN -perm [-/]MODE -regex PATTERN
      -readable -writable -executable
      -wholename PATTERN -size N[bcwkMG] -true -type [bcdpflsD] -uid N
      -used N -user NAME -xtype [bcdpfls]      -context CONTEXT

actions: -delete -print0 -printf FORMAT -fprintf FILE FORMAT -print 
      -fprint0 FILE -fprint FILE -ls -fls FILE -prune -quit
      -exec COMMAND ; -exec COMMAND {} + -ok COMMAND ;
      -execdir COMMAND ; -execdir COMMAND {} + -okdir COMMAND ;

Valid arguments for -D:
exec, opt, rates, search, stat, time, tree, all, help
Use '-D help' for a description of the options, or see find(1)

二、内容查找(grep、egrep、fgrep)

1、格式

grep [选项] [模式] [文件]

  • 选项
常见选项 含义 备注
-E 开启扩展的正则表达式
-i 忽略大小写
-v 翻转过来,只打印没有匹配的
-n 显示行号
-w 被匹配的文本只能是单词,而不是单词中的某一部分
-c 显示总共有多少行被匹配到了,而不是显示被匹配的内容 如果使用-cv,则显示有多少行没有被匹配到
-o 只显示被模式匹配到的字符串
- A n 显示匹配到的字符串所在的行及其后n行 after
-B n 显示匹配到的字符串所在的行及其前n行 before
-C n 显示匹配到的字符串所在的行及其前后各n行 context
  • 模式

直接输入要匹配的字符串,可使用fgrep来替代提高查找速度,或者使用基本正则表达式。

正则表达式 含义 备注
\ 忽略正则表达式中特殊字符的原有含义 转义字符
^ 匹配正则表达式的开始行
$ 匹配正则表达式的结束行
[ ] 单个字符
[ - ] 范围
. 所有的单个字符
* 0或多个字符
? 0次或1次
{m, n} 匹配前面出现字符串范围为m到n次

三、搜索系统命令的位置(which)

在PATH变量指定的路径中,搜索某个系统命令的位置,并且返回第一个搜索结果。使用which命令,就可以看到某个系统命令是否存在,以及执行的到底是哪一个位置的命令

[14:29@zhouchao ~]$which egrep
/usr/bin/egrep
[14:30@zhouchao ~]$which grep
/usr/bin/grep
[14:30@zhouchao ~]$which ls
/usr/bin/ls
[14:30@zhouchao ~]$_

四、程序名搜索(whereis)

whereis命令只能用于程序名的搜索,而且只搜索二进制文件(参数-b)、man说明文件(参数-m)和源代码文件(参数-s)。如果省略参数,则返回所有信息。

[14:32@zhouchao ~]$whereis grep
grep: /usr/bin/grep /usr/share/man/man1/grep.1.gz /usr/share/info/grep.info.gz
[14:32@zhouchao ~]$whereis egrep
egrep: /usr/bin/egrep /usr/share/man/man1/egrep.1.gz
[14:32@zhouchao ~]$whereis ls
ls: /usr/bin/ls /usr/share/man/man1/ls.1.gz
[14:32@zhouchao ~]$_

五、查找文件名称(locate)

locate命令其实是"find -name"的另一种写法,但是要比后者快得多,原因在于它不搜索具体目录,而是搜索一个数据库(/var/lib/locatedb),该数据库中含有本地所有文件信息。Linux系统自动创建这个数据库,并且每天自动更新一次,所以使用locate命令查不到最新变动过的文件。为了避免这种情况,可以在使用locate之前,先使用updatedb命令,手动更新数据库。

六、类型识别指令(type)

它是用来区分某个命令到底是由shell自带的,还是由shell外部的独立二进制文件提供的.

[14:37@zhouchao ~]$type cd
cd is a shell builtin
[14:37@zhouchao ~]$type ls
ls is aliased to `ls --color=auto'
[14:37@zhouchao ~]$type grep
grep is aliased to `grep --color=auto'
[14:38@zhouchao ~]$type egrep
egrep is aliased to `egrep --color=auto'
[14:39@zhouchao ~]$type pwd
pwd is a shell builtin
[14:39@zhouchao ~]$type -p egrep
[14:39@zhouchao ~]$which egrep
alias egrep='egrep --color=auto'
        /bin/egrep
[14:39@zhouchao ~]$
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容