一、概论
- 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 ~]$