返回顶部

[Linux]Linux系统查找文件命令总结

# 1. ***find***
## 简介
find是最常见和最强大的查找命令,你可以用它找到任何你想找的文件find的使用格式如下:
## 使用
find <指定目录> <指定条件> <指定动作>
<指定目录>: 所要搜索的目录及其所有子目录。默认为当前目录。
<指定条件>: 所要搜索的文件的特征,常用的有-name`、`-type`、`-ctime。
<指定动作>: 对搜索结果进行特定的处理。
如果什么参数也不加,find默认搜索当前目录及其子目录,并且不过滤任何结果(也就是返回所有文件),将它们全都显示在屏幕上。

### 使用实例:

#### 根据文件名查找

列出当前目录以及子目录下的所有文件

```shell
find .
```

找到当前目录下名字为11.png的文件
```shell
find . -name "11.png"
```

找到当前目录下所有的jpg文件
```shell
find . -name "*.jpg"
```

找到当前目录下的jpg文件和png文件
```shell
find . -name "*.jpg" -o -name "*.png"
```

找出当前目录下不是以png结尾的文件

```shell
find . ! -name "*.png"
```

搜索当前目录(含子目录,以下同)中,所有文件名以my开头的文件。
```shell
find . -name "my*"
```

搜索当前目录中,所有文件名以my开头的文件,并显示它们的详细信息。
```shell
find . -name "my*" -ls
```
---
#### 根据正则表达式查找

备注:正则表示式比原先想的要复杂,支持好几种类型。可以参考[这里](http://www.gnu.org/software/findutils/manual/html_mono/find.html#emacs-regular-expression-syntax)

找到当前目录下,文件名都是数字的`png`文件。

```shell
find . -regex "\./*[0-9]+\.png"
```
---
#### 根据路径查找

找出当前目录下,路径中包含`wysiwyg`的文件/路径。

```shell
find . -path "*wysiwyg*"
```
---
#### 根据文件类型查找

通过-type进行文件类型的过滤。

|---缩写---|---释义---|
|------------|--------------|
|f| 普通文件|
|l| 符号连接|
|d| 目录|
|c| 字符设备|
|b| 块设备|
|s| 套接字|
|p| Fifo|
举例,查找当前目录下,路径中包含wysiwyg的文件

find . -type f -path "*wysiwyg*"

#### 限制搜索深度
找出当前目录下所有的`png`,不包括子目录。

```shell
find . -maxdepth 1 -name "*.png"
```
相对应的,也是`mindepth`选项。

```shell
find . -mindepth 2 -maxdepth 2 -name "*.png"
```

---
#### 根据文件大小
通过`-size`来过滤文件尺寸。支持的文件大小单元如下

| ---缩写--- | ---释义--- |
| ---------- | ----------- |
| b | 块(512字节) |
| c | 字节 |
| w | 字(2字节) |
| k | 千字节 |
| M | 兆字节 |
| G | 吉字节 |

举例来说,找出当前目录下文件大小超过100M的文件

```
find . -type f -size +100M
```

---

#### 根据访问/修改/变化时间

支持下面的时间类型。

1. 访问时间(-atime/天,-amin/分钟):用户最近一次访问时间。
2. 修改时间(-mtime/天,-mmin/分钟):文件最后一次修改时间。
3. 变化时间(-ctime/天,-cmin/分钟):文件数据元(例如权限等)最后一次修改时间。
搜索当前目录中,所有过去10分钟中更新过的普通文件。如果不加-type f参数,则搜索普通文件+特殊文件+目录。

找出1天内被修改过的文件
```shell
find . -type f -mtime -1
```
找出最近1周内被访问过的文件
```shell
find . -type f -atime -7
```
将日志目录里超过一个礼拜的日志文件,移动到/tmp/old_logs里。
```shell
find . -type f -mtime +7 -name "*.log" -exec mv {} /tmp/old_logs \;
```
**<font color =red>注意:{} 用于与-exec选项结合使用来匹配所有文件,然后会被替换为相应的文件名。</font>**
<font color = red>**另外,\;用来表示命令结束,如果没有加,则会有如下提示**</font>

```shell
find: -exec: no terminating ";" or "+"
```
---
#### 根据权限
通过-perm来实现。举例,找出当前目录下权限为777的文件
```shell
find . -type f -perm 777
```
找出当前目录下权限不是644的php文件
```shell
find . -type f -name "*.php" ! -perm 644
```
---
#### 根据文件拥有者
找出文件拥有者为root的文件
```shell
find . -type f -user root
```
找出文件所在群组为root的文件
```shell
find . -type f -group root
```
---

# 2. *locate*
## 简介
locate命令其实是***find -name***的另一种写法,但是要比后者快得多,原因在于它不搜索具体目录,而是搜索一个数据库(/var/lib/locatedb),这个数据库中含有本地所有文件信息。Linux系统自动创建这个数据库,并且每天自动更新一次,所以使用locate命令查不到最新变动过的文件。为了避免这种情况,可以在使用locate之前,先使用updatedb命令,手动更新数据库。
## 使用实例
```shell
locate inittab
/usr/lib/upstart/migrate-inittab.pl
/usr/share/terminfo/a/ansi+inittabs
```
搜索etc目录下所有以sh开头的文件。
```shell
locate /etc/sh
```
搜索用户主目录下,所有以m开头的文件。
```shell
locate ~/m
```
搜索用户主目录下,所有以m开头的文件,并且忽略大小写。
```shell
locate -i ~/m
```
---
# 3.***whereis***

## 简介

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

## 使用实例:

```shell
whereis grep
```
---
# 4.***grep***
## 简介

Linux grep 命令用于查找文件里符合条件的字符串。

grep 指令用于查找内容包含指定的范本样式的文件,如果发现某文件的内容符合所指定的范本样式,预设 grep 指令会把含有范本样式的那一列显示出来。若不指定任何文件名称,或是所给予的文件名为 **-**,则 grep 指令会从标准输入设备读取数据。

### 语法

```shell
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)
```shell
type cd
```
系统会提示,grep是一个外部命令,并显示该命令的路径
```shell
type grep
```
加上-p参数后,就相当于which命令
```shell
type -p grep
```

posted @ 2019-09-25 15:52  Swetchine  阅读(1456)  评论(0编辑  收藏  举报