Linux常用命令--搜索文件与目录

摘要

  • 文件与目录的检索等相关命令

  • 本文基于CentOS8(x86_64)

文件搜索命令

1.显示系统命令所在目录

1
which mkdir

2.查找文件或目录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
find dir -name filename : 在目录下查找文件名为filename的文件

-name:文件名称,例如:find . -name "*.log" 

-size:文件大小,以block为单位,1block=512k

-size +204800:大于100M

-size -204800:小于100M

-user:文件所有者

-ctime:按文件创建时间来查找文件,-n指n天以内,+n指n天以前

-cmin:同上,分钟

-mtime:按文件更改时间来查找文件,-n指n天以内,+n指n天以前

-mmin:同上,分钟

-atime:按文件访问时间来查找文件

-amin:同上,分钟

-type b/d/c/p/l/f: 查是块设备、目录、字符设备、管道、符号链接、普通文件

-empty:查找在系统中为空的文件或者文件夹

-exec commond {} \; : 将查找到的路径作为commond的参数,并执行,这里命令最后的 \; 是固定搭配,可以替换为 + : -exec commond {} +

find . -name .svn -exec rm -rf {} \; 类似于 : find . -name .svn | xargs rm -rf

find . -name "*.log" -exec cp '{}' ./dir ';' : 将当前目录下的以.log结尾的文件拷贝到./dir下,
类似于find . -name "*.log" | xargs -n1 -i cp {} ./dir
-n[num] : 执行命令时,一次提供几个参数,这里表示,每次传递给cp一个参数

清理30天前的日志文件:
find logdir -name "*.log*" -mtime +30 -type f | xargs rm -f
find . -name "*.log*" -mtime +30 -type f -exec rm -f {} \;


-maxdepth:查找目录最大深度,默认是全部查找

例如:find -maxdepth 2 -name "*${filename}*" -exec cp {} $newfilename \;


-a:and

-o:or

例子:查询大于100M并且所有者为hanqf的文件并将其删除

find /etc -size +204800 -a -user hanqf -exec rm -rf {} \;

!:不等于,不包含,例如:find . ! -type d,查找类型不是目录的文件
  • find示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 查找Linux系统上以.log结尾的日志文件;
find / -name "*.log"
# 查找Linux系统上以.log结尾的日志文件,以access开头的;
find / -name "*.log" -name "access*"
# 查找Linux系统上以.log结尾的日志文件,以access开头的,排除access.log文件;
find / -name "*.log" -name "access*" ! -name access.log
# 查找Linux系统上以.log结尾的日志文件,以access开头的,排除access.log文件,文件修改时间是30天之前的;
find / -name "*.log" -name "access*" ! -name access.log -mtime +30
# 查找Linux系统上以.log结尾的日志文件,以access开头的,排除access.log文件,文件修改时间是30天之前的,文件大小超过200M的;
find / -name "*.log" -name "access*" ! -name access.log -mtime +30 -size +200M
# 查找Linux系统上以.log结尾的日志文件,以access开头的,排除access.log文件,文件修改时间是30天之前的,文件大小超过200M的,将其拷贝至/tmp/目录下。
for i in $(find / -name "*.log" -name "access*" ! -name access.log -mtime +30 -size +200M);do \cp $i /tmp/;done
find / -name "*.log" -name "access*" ! -name access.log -mtime +30 -size +200M -exec cp {} /tmp/ \;
find / -name "*.log" -name "access*" ! -name access.log -mtime +30 -size +200M |xargs -I {} cp {} /tmp/

小贴士

  • find命令中的-mtime参数用于查找基于文件内容最后被修改的时间。它的计算方式是整天,即24小时。以下是一些具体的例子:
1
2
3
4
5
-mtime 0 会找到在过去的24小时内被修改过的文件,
-mtime +0 会找到在超过24小时前被修改过的文件,
-mtime 1 会找到在过去24到48小时内被修改过的文件,
-mtime +1 会找到在超过48小时前被修改过的文件,
-mtime -1 会找到在过去24小时内被修改过的文件。
  • 请注意,在使用-mtime -n-mtime +n时,find命令并不会计算超过或少于n天的部分,这意味着-mtime -1-mtime +0找到的是同一组文件,即在过去24小时内被修改过的文件。

3.从文件索引库中查找文件或目录

1
2
3
updatedb:更新索引,系统会自动定期执行

locate key:从索引库中查找名称包含key的文件和目录

4.在文件中搜索匹配关键字的行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
grep key file : 查找含key的行,等同于 cat file | grep key
例子: grep ^# file : 显示所有行首是#的行

grep -v key file:查找不含key的行
例子: grep -v ^# file : 显示所有行首不是#的行

grep key file -A 10:显示关键字行及其后面的10行

grep key file -B 10:显示关键字行及其前面的10行

grep -E 'key1|key2' -n -i file : 查找包含任意关键字的行,并显示行号
-E 支持正则表达式,-n 显示行号,-i 不区分大小写

grep key -c file : 查找关键字匹配的行数

# 这个命令非常有用,可以快速定位关键字所在的文件位置
grep 'key' -nr dir : 在目录下递归查找文件内容包含关键字的文件路径及其所含关键字的内容
-r 递归查找
-n 显示行号

# 不检索子目录,只检索当前目录下的文件
find . -maxdepth 1 -type f -exec grep -n "特定内容" {} +