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所匹配的东西不起作用
|