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命令常用实例

详细用法请跳转:find命令

  • -name 按照文件名查找文件
find /dir -name filename  在/dir目录及其子目录下面查找名字为filename的文件
find . -name "*.c" 在当前目录及其子目录(用“.”表示)中查找任何扩展名为“c”的文件
  • -perm 按照文件权限来查找文件
find . -perm 755 –print 在当前目录下查找文件权限位为755的文件,即文件属主可以读、写、执行,其他用户可以读、执行的文件

  • -prune 使用这一选项可以使find命令不在当前指定的目录中查找,如果同时使用-depth选项,那么-prune将被find命令忽略。详细用法请跳转:find命令的prune用法总结
$ find . -path ./folder3 -prune -o -type f -print
./folder2/sub1/file1
./folder2/sub2/file2
  • -depth:在查找文件时,首先查找当前目录中的文件,然后再在其子目录中查找。(-maxdepth、-mindepth)
find / -name "CON.FILE" -depth –print 它将首先匹配所有的文件然后再进入子目录中查找
  • -user 按照文件属主来查找文件。
find ~/study/command_line_study/find/ -user root -type f -print 在指定目录中查找文件属主为root的文件
  • -mtime -n +n 按照文件的更改时间来查找文件, -n表示文件更改时间距现在n天以内,+n表示文件更改时间距现在n天以前。
find / -mtime -5 –print 在系统根目录下查找更改时间在5日以内的文件
find /var/adm -mtime +3 –print 在/var/adm目录下查找更改时间在3日以前的文件
  • -type 查找某一类型的文件
    诸如:
    b - 块设备文件。
    d - 目录。
    c - 字符设备文件。
    p - 管道文件。
    l - 符号链接文件。
    f - 普通文件。
find /etc -type d –print 在/etc目录下查找所有的目录
find . ! -type d –print 在当前目录下查找除目录以外的所有类型的文件
find /etc -type l –print 在/etc目录下查找所有的符号链接文件
  • -size n[c] 查找文件长度为n块的文件,带有c时表示文件长度以字节计。
find . -size +1000000c –print 在当前目录下查找文件长度大于1 M字节的文件
find /home/apache -size 100c –print 在/home/apache目录下查找文件长度恰好为100字节的文件
find . -size +10 –print 在当前目录下查找长度超过10块的文件(一块等于512字节)
  • -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’匹配所有以grep开头的行
$锚定行的结束 如:‘grep$’ 匹配所有以grep结尾的行
.匹配一个非换行符的字符 如:'gr.p’匹配gr后接一个任意字符,然后是p
*匹配零个或多个先前字符 如:’*grep’匹配所有一个或多个空格后紧跟grep的行
.*一起用代表任意字符
[]匹配一个指定范围内的字符,如’[Gg]rep’匹配Grep和grep
[^]匹配一个不在指定范围内的字符,如:’[^A-FH-Z]rep’匹配不包含A-R和T-Z的一个字母开头,紧跟rep的行
(…)标记匹配字符,如’(love)’,love被标记为1
<锚定单词的开始,如:’<grep’匹配包含以grep开头的单词的行
>锚定单词的结束,如’grep>'匹配包含以grep结尾的单词的行
x{m}重复字符x,m次,如:'0{5}'匹配包含5个0的行
x{m,}重复字符x,至少m次,如:'o{5,}'匹配至少有5个o的行
x{m,n}重复字符x,至少m次,不多于n次,如:'o{5,10}'匹配5–10个o的行
\w匹配文字和数字字符,也就是[A-Za-z0-9],如:'G\w*p’匹配以G后跟零个或多个文字或数字字符,然后是p
\W\w的反置形式,匹配一个或多个非单词字符,如点号句号等
\b单词锁定符,如: '\bgrep\b’只匹配grep

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 "(\d{3}\-){2}\d{4}" file_name

只输出文件中匹配到的部分 -o 选项:

echo this is a test line. | grep -o -E "[a-z]+\."
line.

echo this is a test line. | egrep -o "[a-z]+\."
line.

统计文件或者文本中包含匹配字符串的行数 -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

打印样式匹配所位于的字符或字节偏移:

echo gun is not unix | grep -b -o "not"
7:not
#一行中字符串的字符便宜是从该行的第一个字符开始计算,起始值为0。选项  **-b -o**  一般总是配合使用。

搜索多个文件并查找匹配文本在哪些文件中:

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递归搜索文件

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

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

选项 -e-f 制动多个匹配样式:

echo this is a text line | grep -e "is" -e "line" -o
is
line

#也可以使用 **-f** 选项来匹配多个样式,在样式文件中逐行写出需要匹配的字符。
cat patfile
aaa
bbb

echo aaa bbb ccc ddd eee | grep -f patfile -o

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

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

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

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

使用0值字节后缀的grep与xargs:

# 测试文件:
echo "aaa" > file1
echo "bbb" > file2
echo "aaa" > file3

grep "aaa" file* -lZ | xargs -0 rm

# 执行后会删除file1和file3,grep输出用-Z选项来指定以0值字节作为终结符文件名(\0),xargs -0 读取输入并用0值字节终结符分隔文件名,然后删除匹配文件,-Z通常和-l结合使用。

grep静默输出:

grep -q "test" filename
# 不会输出任何信息,如果命令运行成功返回0,失败则返回非0值。一般用于条件测试。

其他查找命令

1.locate命令

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

locate命令的使用实例:

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

2. 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

3. which命令

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

which命令的使用实例:

$ which grep
/bin/grep
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值