[shell]Linux常用的查找命令
1. find
简介
find是最常见和最强大的查找命令,你可以用它找到任何你想找的文件find的使用格式如下:
使用
find <指定目录> <指定条件> <指定动作>
<指定目录>: 所要搜索的目录及其所有子目录。默认为当前目录。
<指定条件>: 所要搜索的文件的特征,常用的有-name、-type、-ctime。
<指定动作>: 对搜索结果进行特定的处理。
如果什么参数也不加,find默认搜索当前目录及其子目录,并且不过滤任何结果(也就是返回所有文件),将它们全都显示在屏幕上。
使用实例:
根据文件名查找
列出当前目录以及子目录下的所有文件
find .
找到当前目录下名字为11.png的文件
find . -name "11.png"
找到当前目录下所有的jpg文件
find . -name "*.jpg"
找到当前目录下的jpg文件和png文件
find . -name "*.jpg" -o -name "*.png"
找出当前目录下不是以png结尾的文件
find . ! -name "*.png"
搜索当前目录(含子目录,以下同)中,所有文件名以my开头的文件。
find . -name "my*"
搜索当前目录中,所有文件名以my开头的文件,并显示它们的详细信息。
find . -name "my*" -ls
根据正则表达式查找
备注:正则表示式比原先想的要复杂,支持好几种类型。可以参考这里
找到当前目录下,文件名都是数字的png文件。
find . -regex "\./*[0-9]+\.png"
根据路径查找
找出当前目录下,路径中包含wysiwyg的文件/路径。
find . -path "*wysiwyg*"
根据文件类型查找
通过-type进行文件类型的过滤。
| ---缩写--- | ---释义--- |
|---|---|
| f | 普通文件 |
| l | 符号连接 |
| d | 目录 |
| c | 字符设备 |
| b | 块设备 |
| s | 套接字 |
| p | Fifo |
| 举例,查找当前目录下,路径中包含wysiwyg的文件 |
find . -type f -path "*wysiwyg*"
限制搜索深度
找出当前目录下所有的png,不包括子目录。
find . -maxdepth 1 -name "*.png"
相对应的,也是mindepth选项。
find . -mindepth 2 -maxdepth 2 -name "*.png"
根据文件大小
通过-size来过滤文件尺寸。支持的文件大小单元如下
| ---缩写--- | ---释义--- |
|---|---|
| b | 块(512字节) |
| c | 字节 |
| w | 字(2字节) |
| k | 千字节 |
| M | 兆字节 |
| G | 吉字节 |
举例来说,找出当前目录下文件大小超过100M的文件
find . -type f -size +100M
根据访问/修改/变化时间
支持下面的时间类型。
- 访问时间(-atime/天,-amin/分钟):用户最近一次访问时间。
- 修改时间(-mtime/天,-mmin/分钟):文件最后一次修改时间。
- 变化时间(-ctime/天,-cmin/分钟):文件数据元(例如权限等)最后一次修改时间。
搜索当前目录中,所有过去10分钟中更新过的普通文件。如果不加-type f参数,则搜索普通文件+特殊文件+目录。
找出1天内被修改过的文件
find . -type f -mtime -1
找出最近1周内被访问过的文件
find . -type f -atime -7
将日志目录里超过一个礼拜的日志文件,移动到/tmp/old_logs里。
find . -type f -mtime +7 -name "*.log" -exec mv {} /tmp/old_logs \;
注意:{} 用于与-exec选项结合使用来匹配所有文件,然后会被替换为相应的文件名。
另外,;用来表示命令结束,如果没有加,则会有如下提示
find: -exec: no terminating ";" or "+"
根据权限
通过-perm来实现。举例,找出当前目录下权限为777的文件
find . -type f -perm 777
找出当前目录下权限不是644的php文件
find . -type f -name "*.php" ! -perm 644
根据文件拥有者
找出文件拥有者为root的文件
find . -type f -user root
找出文件所在群组为root的文件
find . -type f -group root
2. locate
简介
locate命令其实是find -name的另一种写法,但是要比后者快得多,原因在于它不搜索具体目录,而是搜索一个数据库(/var/lib/locatedb),这个数据库中含有本地所有文件信息。Linux系统自动创建这个数据库,并且每天自动更新一次,所以使用locate命令查不到最新变动过的文件。为了避免这种情况,可以在使用locate之前,先使用updatedb命令,手动更新数据库。
使用实例
locate inittab
/usr/lib/upstart/migrate-inittab.pl
/usr/share/terminfo/a/ansi+inittabs
搜索etc目录下所有以sh开头的文件。
locate /etc/sh
搜索用户主目录下,所有以m开头的文件。
locate ~/m
搜索用户主目录下,所有以m开头的文件,并且忽略大小写。
locate -i ~/m
3.whereis
简介
whereis命令只能用于程序名的搜索,而且只搜索二进制文件(参数-b)、man说明文件(参数-m)和源代码文件(参数-s)。如果省略参数,则返回所有信息。
使用实例:
whereis grep
4.grep
简介
Linux grep 命令用于查找文件里符合条件的字符串。
grep 指令用于查找内容包含指定的范本样式的文件,如果发现某文件的内容符合所指定的范本样式,预设 grep 指令会把含有范本样式的那一列显示出来。若不指定任何文件名称,或是所给予的文件名为 -,则 grep 指令会从标准输入设备读取数据。
语法
grep [-abcEFGhHilLnqrsvVwxy][-A<显示行数>][-B<显示列数>][-C<显示列数>][-d<进行动作>][-e<范本样式>][-f<范本文件>][--help][范本样式][文件或目录...]
参数
| ---参数--- | ---释义--- |
|---|---|
| -a 或 --text | 不要忽略二进制的数据。 |
| -A<显示行数> 或 --after-context=<显示行数> | 除了显示符合范本样式的那一列之外,并显示该行之后的内容 |
| -b 或 --byte-offset | 在显示符合样式的那一行之前,标示出该行第一个字符的编号。 |
| -B<显示行数> 或 --before-context=<显示行数> | 除了显示符合样式的那一行之外,并显示该行之前的内容。 |
| -c 或 --count | 计算符合样式的列数。 |
| -C<显示行数> 或 --context=<显示行数>或-<显示行数> | 除了显示符合样式的那一行之外,并显示该行之前后的内容。 |
| -d <动作> 或 --directories=<动作> | 当指定要查找的是目录而非文件时,必须使用这项参数,否则grep指令将回报信息并停止动作。 |
| -e<范本样式> 或 --regexp=<范本样式> | 指定字符串做为查找文件内容的样式。 |
| -E 或 --extended-regexp | 将样式为延伸的正则表达式来使用。 |
| -f<规则文件> 或 --file=<规则文件> | 指定规则文件,其内容含有一个或多个规则样式,让grep查找符合规则条件的文件内容,格式为每行一个规则样式。 |
| -F 或 --fixed-regexp | 将样式视为固定字符串的列表。 |
| -G 或 --basic-regexp | 将样式视为普通的表示法来使用。 |
| -h 或 --no-filename | 在显示符合样式的那一行之前,不标示该行所属的文件名称。 |
| -H 或 --with-filename | 在显示符合样式的那一行之前,表示该行所属的文件名称。 |
| -i 或 --ignore-case | 忽略字符大小写的差别。 |
| -l 或 --file-with-matches | 列出文件内容符合指定的样式的文件名称。 |
| -L 或 --files-without-match | 列出文件内容不符合指定的样式的文件名称。 |
| -n 或 --line-number | 在显示符合样式的那一行之前,标示出该行的列数编号。 |
| -o 或 --only-matching | 只显示匹配PATTERN 部分。 |
| -q 或 --quiet或--silent | 不显示任何信息。 |
| -r 或 --recursive | 此参数的效果和指定"-d recurse"参数相同。 |
| -s 或 --no-messages | 不显示错误信息。 |
| -v 或 --invert-match | 显示不包含匹配文本的所有行。 |
| -V 或 --version | 显示版本信息。 |
| -w 或 --word-regexp | 只显示全字符合的列。 |
| -x --line-regexp | 只显示全列符合的列。 |
| -y | 此参数的效果和指定"-i"参数相同。 |
使用实例
1、在当前目录中,查找后缀有 file 字样的文件中包含 test 字符串的文件,并打印出该字符串的行。此时,可以使用如下命令:
grep test *file
结果如下所示:
$ grep test test* #查找前缀有“test”的文件包含“test”字符串的文件
testfile1:This a Linux testfile! #列出testfile1 文件中包含test字符的行
testfile_2:This is a linux testfile! #列出testfile_2 文件中包含test字符的行
testfile_2:Linux test #列出testfile_2 文件中包含test字符的行
2、以递归的方式查找符合条件的文件。例如,查找指定目录/etc/acpi 及其子目录(如果存在子目录的话)下所有文件中包含字符串"update"的文件,并打印出该字符串所在行的内容,使用的命令为:
grep -r update /etc/acpi
输出结果如下:
$ grep -r update /etc/acpi #以递归的方式查找“etc/acpi”
#下包含“update”的文件
/etc/acpi/ac.d/85-anacron.sh:# (Things like the slocate updatedb cause a lot of IO.)
Rather than
/etc/acpi/resume.d/85-anacron.sh:# (Things like the slocate updatedb cause a lot of
IO.) Rather than
/etc/acpi/events/thinkpad-cmos:action=/usr/sbin/thinkpad-keys--update
3、反向查找。前面各个例子是查找并打印出符合条件的行,通过"-v"参数可以打印出不符合条件行的内容。
查找文件名中包含 test 的文件中不包含test 的行,此时,使用的命令为:
grep -v test *test*
结果如下所示:
$ grep-v test* #查找文件名中包含test 的文件中不包含test 的行
testfile1:helLinux!
testfile1:Linis a free Unix-type operating system.
testfile1:Lin
testfile_1:HELLO LINUX!
testfile_1:LINUX IS A FREE UNIX-TYPE OPTERATING SYSTEM.
testfile_1:THIS IS A LINUX TESTFILE!
testfile_2:HELLO LINUX!
testfile_2:Linux is a free unix-type opterating system.
5.type
简介
type命令其实不能算查找命令,它是用来区分某个命令到底是由shell自带的,还是由shell外部的独立二进制文件提供的。如果一个命令是外部命令,那么使用-p参数,会显示该命令的路径,相当于which命令。
使用实例
系统会提示,cd是shell的自带命令(build-in)
type cd
系统会提示,grep是一个外部命令,并显示该命令的路径
type grep
加上-p参数后,就相当于which命令
type -p grep

浙公网安备 33010602011771号