Linux系统find命令使用

Linux系统find命令使用

𝓓𝓸𝓷 Lv6

linux find命令

1.查找3天前的文件并删除

1
2
3
4
5
find . -name "*.bak" -mtime +3 |xargs rm -rf
find . -name "*.bak" -mtime +3 -exec rm -rf {} \;

查找3天内的文件并删除:
find . -name "*.bak" -mtime -3 -exec rm -rf {} \;

2.查找多个文件

find命令在/path/to/directory目录下查找类型为文件的包含file1或file2的文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
find /path/to/directory -type f -name "*file1" -o -name "*file2"

find /backup/* -maxdepth 1 \( -name "*.bak" -o -name "*.trn" \) -mtime +15 |rm -rf

温馨提示:
使用-o运算表达式时,需要使用()把条件刮起来

find . \( -name "*.txt" -o -name "*.pdf" \) #打印当前目录下以.txt或.pdf结尾的文件
find . \( -name "*.txt" -a -name "a*" \) #打印当前目录下以a开头且以.txt结尾的文件
find . -not \( -name "*.txt" -a -name "a*" \) #打印当前目录下不以a开头或不以.txt结尾的文件
find . -not \( -name "*.txt" -o -name "a*" \) #打印当前目录下不以a开头qie不以.txt结尾的文件


---批量删除多个文件
find $backup_path -mtime +31 |egrep "\.(log|sql)$" |xargs rm -rf

/bin/find /oracle/app/oracle/diag/rdbms/hisdb/hisdb -maxdepth 2 -type f -mmin +30 |egrep "\.(trc|trm|xml)$" |xargs rm -rf > /tmp/del_trc_xml.log 2>&1

3.查找某个时间范围内的文件

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
(1)在A机(IP:192.168.1.10)上生成公钥
ssh-keygen -t rsa

(2)将A机公钥传输至B机(IP:192.168.1.50)
/root/.ssh/id_rsa.pub
scp ~/.ssh/id_rsa.pub 192.168.1.50:/root/.ssh/authorized_keys

ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.1.50

(3)查找A机器2024年12月29至2025年1月4日的文件,并传输至B服务器:
find . -newermt "2024-12-29" ! -newermt "2025-01-05" -exec scp -p {} 192.168.1.50:/backup/zjsyemr \;
find . -newermt "2024-12-29" ! -newermt "2025-01-05" -exec cp -r {} /backup \;

有些系统的日期格式不一样,执行会报以下错误:
find: I cannot figure out how to interpret ‘ 01/02/2024’ as a date or time
可以使用 locale LC_TIME命令查看linux系统日期格式:

# locale LC_TIME
Sun;Mon;Tue;Wed;Thu;Fri;Sat
Sunday;Monday;Tuesday;Wednesday;Thursday;Friday;Saturday
Jan;Feb;Mar;Apr;May;Jun;Jul;Aug;Sep;Oct;Nov;Dec
January;February;March;April;May;June;July;August;September;October;November;December
AM;PM
%a %d %b %Y %r %Z
%m/%d/%Y
%r
%I:%M:%S %p






0
S
7
19971130
7
1
2
1

%a %b %e %H:%M:%S %Z %Y
UTF-8

可以看到当前系统的日期格式,然后使用当前系统支持的格式查找文件:
find . -newermt "12/29/2024" ! -newermt "01/05/2025"

find . -newermt "20241229" ! -newermt "20250105" |xargs ls -l

4.-prune排除搜索

1
2
3
4
5
find . ! -name ".txt"   #匹配所有不以.txt结尾的文件
find -maxdepth 1 ! -name "\.*" 显示不是隐藏属性的文件

find . ! -name "." -prune -type f -name "*.trc" | xargs egrep -l "2025-07-13 08" | xargs tar -cvf - | gzip > bdump_trace.tar.gz
find . ! -name "." -prune -type f -name "*.trc" | xargs egrep -l "2025-07-13 02"\|"2025-07-13 10" | xargs tar -cvf - | gzip > bdump_trace.tar.gz

5.maxdepth尝试查找

1
2
3
4
5
# find . -maxdepth 1 -type f     #只列出当前目录下的所有普通文件
-maxdepth:最大深度限制,1表示只在当前目录,2表示向下两级

# find . -mindepth 2 -type f #列出距当前目录至少两个子目录的所有文件
-mindepth:最小深度限制,与上面用法相似。

6.-size按文件大小搜索

1
2
3
4
5
6
7
8
9
10
11
# find . -type f -size +2k                   #查找大于2k的文件
# find . -type f -size 2k  #查找等于2k的文件
# find . -type f -size -2k #查找小于2k的文件

除了k之外,还有其他文件大小单元
b——块(512字节)。
c——字节。
w——字。
k——千字节。
M——兆字节。
G——吉字节。

7.-delete删除匹配的文件

1
2
# find . -type f -name "*.swp" -delete
-delete参数可以实现此功能。

8.按文件权限和用户查找

1
2
3
4
5
# find . -type f -perm 644     # 打印出权限为644的文件
-perm:最好使用八进制的权限表示法

# find . -type f -user root # 打印root用户所拥有的文件
-user:后可解用户名或uid

8.-prune

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
# find  . \(-name ".git" -prune \) -o \( -type f -print \)

解释:圆括号表示表达式的结合。 \ 表示引用,即指示 shell 不对后面的字符作特殊解释,而留给 find 命令去解释其意义。
在使用-prune选项时要当心,因为如果你同时使用了-depth选项,那么-prune选项就会被find命令忽略,因 -delete 默认开启递归搜索

# find . -name remoting.jar -prune -o -print
此命令会排除所有名为 remoting.jar 的文件或目录
-prune 与 -o(或操作符)结合使用时,需注意逻辑顺序,例如 -prune -o -print 表示先排除指定目录再执行打印操作

示例:
$ tree .
.
├── folder1
├── folder2
│ ├── sub1
│ │ └── file1
│ └── sub2
│ └── file2
└── folder3
└── file3

5 directories, 3 files

这是用来做说明的文件夹结构。如果我们想查找除了folder3这个文件夹之外的其他文件夹里的文件,可以用这样的命令实现:
# 相对路径
$ find . -path ./folder3 -prune -o -type f -print
./folder2/sub1/file1
./folder2/sub2/file2

# 绝对路径
$ find /root/study/command_line_study/find/ -path /root/study/command_line_study/find/folder3 -prune -o -type f -print
/root/study/command_line_study/find/folder2/sub1/file1
/root/study/command_line_study/find/folder2/sub2/file2

find后面的第一个英文点号.表示当前根路径,-path ./folder3表示匹配路径为./folder3的文件夹,-prune表示把前面命令所匹配到的路径排除,不再进入该路径下面继续查找,-o表示或,-type f表示查找文件,-print表示打印查找结果到命令行终端。

有几个需要注意的点:
-path后面需要跟绝对路径或者是相对路径,不能只有文件夹名称

$ find . -path folder3 -prune -o -type f -print
./folder2/sub1/file1
./folder2/sub2/file2
./folder3/file3

这样是错误的。把-path改成-name就可以了:
$ find . -name folder3 -prune -o -type f -print
./folder2/sub1/file1
./folder2/sub2/file2

-o 开始让我感到很疑惑。它的意思是OR,那就是既匹配了前面的./folder3,又匹配了后面的-type f,可为什么打印出来的没有./folder3呢?原来是因为-print只对离自己最近的一个匹配条件起作用,在这个例子里也就是只打印-o后面的匹配条件所匹配的文件,对-o前面的-path folder3 -prune所匹配的东西不起作用
  • Title: Linux系统find命令使用
  • Author: 𝓓𝓸𝓷
  • Created at : 2025-01-05 12:18:30
  • Updated at : 2025-07-23 12:05:41
  • Link: https://www.zhangdong.me/linux-find.html
  • License: This work is licensed under CC BY-NC-SA 4.0.
评论