Linux 查找命令 find, grep, which, whereis, locate

Posted 爱上口袋的天空

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux 查找命令 find, grep, which, whereis, locate相关的知识,希望对你有一定的参考价值。

一、find命令

find < path > < expression >

  • path: 查找的文件路径,默认为当前目录,/表示根目录,.表示当前目录,…表示上级目录
  • expression: 表达式可以分为-options[-print -exec -ok]

  • -options,find命令的常用选项(本文重点说明)
  • -print,将find命令匹配的文件输出到标准输出
  • -exec,对find命令匹配的文件执行该参数给出的shell命令,相应命令的形式为’command’ \\(注意\\前有个空格)
  • -ok,功能和-exec相同,不过在执行每个命令之前需要用户确认

如果什么参数也不加,find默认搜索当前目录及其子目录,并且不过滤任何结果(也就是返回所有文件),将它们全都显示在屏幕上。

find命令常用选项:

-name <表达式> 根据文件名查找文件
-iname <表达式> 根据文件名查找文件,忽略大小写
-path <表达式> 根据路径查找文件
-ipath <表达式> 根据路径查找文件,忽略大小写
-amin <分钟> 过去N分钟内访问过的文件
-atime <天数> 过去N天内访问过的文件
-cmin <分钟> 过去N分钟内修改过的文件
-ctime <天数> 过去N天内修改过的文件
-mmin<分钟>过去N分钟曾被更改过的文件或目录
-mtime<天数>过去N天曾被更改过的文件或目录
-anewer <参照文件> 比参照文件更晚被读取过的文件
-cnewer <参照文件> 比参照文件更晚被修改过的文件 同–newer
-size <大小> 根据文件大小查找文件,单位b c w k M G
-type <文件类型> 根据文件类型查找文件。b 块设备 c 字符设备 d 目录 p 管道文件 f 普通文件 l 链接 s 端口文件
-user <用户名> 按归属用户查找文件
-uid 按UID查找文件
-group <群组名> 按归属群组查找文件
-gid 按GID查找文件
-empty 查找空文件
-depth:从指定目录下最深层的子目录开始查找
-maxdepth<目录层级>设置最大目录层级
-mindepth<目录层级>设置最小目录层
-regex<正则表达式>
-o 或关系
-a 与关系 !否定关系

find命令常用实例:

  • -name 按照文件名查找文件
find /dir -name filename  在/dir目录及其子目录下面查找名字为filename的文件
find . -name "*.c" 在当前目录及其子目录(用“.”表示)中查找任何扩展名为“c”的文件
  • /home目录下查找以.txt结尾的文件名
find /home -name "*.txt"
同上,但忽略大小写
find /home -iname "*.txt"
  • 当前目录及子目录下查找所有以.txt.pdf结尾的文件
find . \\( -name "*.txt" -o -name "*.pdf" \\)

或

find . -name "*.txt" -o -name "*.pdf"
  • 找出/home下不是以.txt结尾的文件
find /home ! -name "*.txt"
  • 根据文件类型进行搜索
find . -type 类型参数
类型参数列表:
f 普通文件
l 符号连接
d 目录
c 字符设备
b 块设备
s 套接字
p Fifo
  • 删除当前目录下所有.txt文件
find . -type f -name "*.txt" -delete
  • -exec,find命令对匹配的文件执行该参数所给出的shell命令。相应命令的形式为’command’ ;,注意和;之间的空格
$ find ./ -size 0 -exec rm  \\; 删除文件大小为零的文件
$ rm -i `find ./ -size 0`  
$ find ./ -size 0 | xargs rm -f &
 
为了用ls -l命令列出所匹配到的文件,可以把ls -l命令放在find命令的-exec选项中:
$ find . -type f -exec ls -l  \\;
在/logs目录中查找更改时间在5日以前的文件并删除它们:
find /logs -type f -mtime +5 -exec rm  \\;
  • -ok,和-exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行。
find . -name "*.conf"  -mtime +5 -ok rm    \\; 在当前目录中查找所有文件名以.LOG结尾、更改时间在5日以上的文件,并删除它们,只不过在删除之前先给出提示

二、grep命令

grep [选项] pattern [文件名]

选项:

-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 # 在显示符合范本样式的那一列之前,标示出该列的编号。
-P --perl-regexp # PATTERN 是一个 Perl 正则表达式
-q --quiet或–silent # 不显示任何信息。
-R/-r --recursive # 此参数的效果和指定“-d recurse”参数相同。
-s --no-messages # 不显示错误信息。
-v --revert-match # 反转查找。
-V --version # 显示版本信息。
-w --word-regexp # 只显示全字符合的列。
-x --line-regexp # 只显示全列符合的列。
-y # 此参数效果跟“-i”相同。
-o # 只输出文件中匹配到的部分。
-m --max-count= # 找到num行结果后停止查找,用来限制匹配行数

规则表达式:

 

grep命令常见用法:

  •  在文件中搜索一个单词,命令会返回一个包含 “match_pattern” 的文本行:
grep match_pattern file_name
grep "match_pattern" file_name

在多个文件中查找:

grep "match_pattern" file_1 file_2 file_3 ...
  • 输出除之外的所有行 -v 选项:
grep -v "match_pattern" file_name
  • 标记匹配颜色 --color=auto 选项:
grep "match_pattern" file_name --color=auto
  • 使用正则表达式 -E 选项:
grep -E "[1-9]+"
# 或
egrep "[1-9]+"
  • 使用正则表达式 -P 选项:
grep -P "(\\d3\\-)2\\d4" file_name
  • 统计文件或者文本中包含匹配字符串的行数 -c 选项:
grep -c "text" file_name
  • 输出包含匹配字符串的行号 -n 选项:
grep "text" -n file_name
# 或
cat file_name | grep "text" -n

#多个文件
grep "text" -n file_1 file_2
  • 搜索多个文件并查找匹配文本在哪些文件中:
grep -l "text" file1 file2 file3...

$ grep "hello" file1 file2 file3
file1:hello java
file2:hello python
file3:hello shell

$ grep -l "hello" file1 file2 file3
file1
file2
file3

在多级目录中对文本进行递归搜索:

grep "text" . -r -n
# .表示当前目录。

$ grep "hello" . -r -n
./多个文件搜索/file2:1:hello python
./多个文件搜索/file3:1:hello shell
./多个文件搜索/file1:1:hello java

忽略匹配样式中的字符大小写:

echo "hello world" | grep -i "HELLO"
# hello world

在grep搜索结果中包括或者排除指定文件:

# 只在目录中所有的.php和.html文件中递归搜索字符"main()"
grep "main()" . -r --include *.php,html

# 在搜索结果中排除所有README文件
grep "main()" . -r --exclude "README"

# 在搜索结果中排除filelist文件列表里的文件
grep "main()" . -r --exclude-from filelist

三、locate命令

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

locate命令的使用实例:

$ locate /etc/sh
搜索etc目录下所有以sh开头的文件。
$ locate -i ~/m
搜索用户主目录下,所有以m开头的文件,并且忽略大小写。

四、whereis命令

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

whereis命令的使用实例:

$ whereis grep
grep: /bin/grep /usr/share/man/man1p/grep.1p.gz /usr/share/man/man1/grep.1.gz

五、which命令

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

which命令的使用实例:

$ which grep
/bin/grep

以上是关于Linux 查找命令 find, grep, which, whereis, locate的主要内容,如果未能解决你的问题,请参考以下文章

Linux下find命令和grep命令查找文件

linux下的find文件查找命令与grep文件内容查找命令

Linux中的find和grep命令对查找到的文件如何处理啊

Linux中的find和grep命令对查找到的文件如何处理啊

linux下的find文件查找命令与grep文件内容查找命令

linux下的find文件查找命令与grep文件内容查找命令