1. 命令解析
命令用途:
在文件系统中查找文件,该命令功能强大,参数较多;在较大容量的目录中查找时,find命令会执行较长的时间,建议在后台执行此类命令。
命令格式:
find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]
默认目录是当前目录,默认的表达式是-print,默认的逻辑运算符是-a(AND),表达式的类型有:operators, options, tests, 和 actions
命令参数:
operators (decreasing precedence; -and is implicit where no others are given):
( EXPR ) ! EXPR -not EXPR EXPR1 -a EXPR2 EXPR1 -and EXPR2
EXPR1 -o EXPR2 EXPR1 -or EXPR2 EXPR1 , EXPR2
positional options (always true): -daystart -follow -regextype
normal options (always true, specified before other expressions):
-depth --help -maxdepth LEVELS -mindepth LEVELS -mount -noleaf
--version -xautofs -xdev -ignore_readdir_race -noignore_readdir_race
tests (N can be +N or -N or N): -amin N -anewer FILE -atime N -cmin N
-cnewer FILE -ctime N -empty -false -fstype TYPE -gid N -group NAME
-ilname PATTERN -iname PATTERN -inum N -iwholename PATTERN -iregex PATTERN
-links N -lname PATTERN -mmin N -mtime N -name PATTERN -newer FILE
-nouser -nogroup -path PATTERN -perm [+-]MODE -regex PATTERN
-readable -writable -executable
-wholename PATTERN -size N[bcwkMG] -true -type [bcdpflsD] -uid N
-used N -user NAME -xtype [bcdpfls]
-context CONTEXT
actions: -delete -print0 -printf FORMAT -fprintf FILE FORMAT -print
-fprint0 FILE -fprint FILE -ls -fls FILE -prune -quit
-exec COMMAND ; -exec COMMAND {} + -ok COMMAND ;
-execdir COMMAND ; -execdir COMMAND {} + -okdir COMMAND ;
常用参数
符号解析:+N表示大于N,-N表示小于N,N表示等于N
-mtime ±N 按文件的更新时间来查找,+N表示N天以外的,-N表示N天以内的,如file1是前天修改的,则通过(+1或-2)可找到;file2是昨天修改的,则通过-1可找到。
2. 示例
2.1 在当前目录按照文件名精确查找文件 -name
[root@test test]# find . -name history.log
./lessTest/history.log
2.1 在当前目录按照文件名使用通配符查找文件 -name
[root@test test]# find . -name *.log
./lessTest/history.log
./headTest/hisotry.log
./headTest/ping.log
2.2 按类型来查找目录 -type
[root@test test]# find . -type d
.
./catTest
./nlTest
./lessTest
./headTest
./moreTest
[root@test test]# find . -type d -name 'less*'
./lessTest
[root@test test]# find . -type f -name '*.log'
./lessTest/history.log
./headTest/hisotry.log
./headTest/ping.log
2.3 按大小来查找 -c
[root@test test]# find . -size +100k -type f
./lessTest/history.log
./lessTest/Kconfig
./headTest/hisotry.log
./headTest/ping.log
./moreTest/Kconfig
[root@test test]# find -type f -size -2M #小于2M的
./catTest/f3
./catTest/f4
./catTest/f1
./findTest/F1
./findTest/f3
./findTest/f4
./findTest/F2
./findTest/f2
./findTest/F3
./findTest/f1
./findTest/2rd/F1
./findTest/2rd/f3
./findTest/2rd/f4
./findTest/2rd/3rd/f1
./findTest/2rd/F2
./findTest/2rd/f2
./findTest/2rd/F3
./findTest/2rd/f1
./nlTest/f1
./lessTest/history.log
./lessTest/Kconfig
./headTest/hisotry.log
./moreTest/Kconfig
./moreTest/f1
[root@test test]# find -type f -size +2M #大于2M的
./headTest/ping.log
[root@test test]# find -type f -size 2M #等于2M的
2.3 按访问时间查找 -mtime
[root@test test]# find . `-atime ±N`
.
./catTest
./nlTest
./lessTest
./lessTest/history.log
./headTest
./moreTest
2.4 按修改时间查找N天内外的 -mtime ±N
[root@test findTest]# find . -mtime -1
.
./f3
./f2
./f1
[root@test findTest]# stat .
File: ‘.’
Size: 4096 Blocks: 8 IO Block: 4096 directory
Device: fd01h/64769d Inode: 265923 Links: 2
Access: (0755/drwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2017-04-22 16:44:21.155000000 +0800
Modify: 2017-04-22 16:43:58.108000000 +0800
Change: 2017-04-22 16:43:58.108000000 +0800
Birth: -
[root@test findTest]# find . -mtime -1
.
./f3
./f2
./f1
[root@test findTest]# find . -mtime +1
[root@test findTest]# find . -mtime -2
.
./f3
./f2
./f1
[root@test findTest]# find . -mtime -1
.
./f3
./f2
./f1
[root@test findTest]# touch -t201701011112.13 f1
[root@test findTest]# stat f1
File: ‘f1’
Size: 3 Blocks: 8 IO Block: 4096 regular file
Device: fd01h/64769d Inode: 265924 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2017-01-01 11:12:13.000000000 +0800
Modify: 2017-01-01 11:12:13.000000000 +0800
Change: 2017-04-22 18:45:27.476000000 +0800
Birth: -
[root@test findTest]# find . -mtime -1
.
./f3
./f2
2.5 查找比某个文件更新的 -newer
[root@test findTest]# touch f4
[root@test findTest]# ls
f1 f2 f3 f4
[root@test findTest]# find . -newer f2
.
./f4
[root@test findTest]# find . -newer f1
.
./f3
./f4
./f2
2.6 查找N分钟内外的 -mmin ±N
[root@test findTest]# find . -mmin -50
.
./f4
[root@test findTest]# find . -mmin +50
./f3
./f2
./f1
[root@test findTest]# stat f4
File: ‘f4’
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: fd01h/64769d Inode: 265927 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2017-04-22 18:47:49.010000000 +0800
Modify: 2017-04-22 18:47:49.010000000 +0800
Change: 2017-04-22 18:47:49.010000000 +0800
2.7 组合逻辑运算OR -o
[root@test test]# find findTest -mmin -60
findTest
findTest/f4
[root@test test]# find findTest -mmin +60
findTest/f3
findTest/f2
findTest/f1
[root@test test]# find findTest -mmin +60 -o -mmin -60
findTest
findTest/f3
findTest/f4
findTest/f2
findTest/f1
2.8 组合逻辑运算 NOT -not
[root@test test]# find findTest -not -mmin -70
findTest/f3
findTest/f2
findTest/f1
[root@test test]# find findTest -mmin -70
findTest
findTest/f4
2.9 组合逻辑运算 AND -a
[root@test test]# find findTest -name 'f*'
findTest
findTest/f3
findTest/f4
findTest/f2
findTest/f1
[root@test test]# find findTest -name 'f*' -a -mmin -70
findTest
findTest/f4
2.10 搜索时采用深度优先的策略(先子目录在根目录) -depth
[root@test 2rd]# find ./3rd
./3rd
./3rd/f1
[root@test 2rd]# find ./3rd -depth
./3rd/f1
./3rd
2.11 忽略某个文件的内容 -prune
[root@test test]# find ./findTest
./findTest
./findTest/test.sh
./findTest/F1
./findTest/f3
./findTest/f4
./findTest/2rd/F1
./findTest/2rd/f3
./findTest/2rd/f4
[root@test test]# find ./findTest -path './findTest/2rd' -prune -o -print
./findTest
./findTest/test.sh
./findTest/F1
./findTest/f3
./findTest/f4
[root@test test]# find . -depth -path "./findTest" -prune -o -print
./catTest/f3
./catTest/f4
./catTest/f1
./catTest
./findTest/test.sh
./findTest/F1
./findTest/f3
./findTest/f4
./findTest/2rd/F1
./findTest/2rd/f3
./findTest/2rd/f4
...省略...
PS:如果参数中同时又-depth,则-prune会失效
find [-path ..] [expression]
在路径列表的后面的是表达式
-path "test" -prune -o -print 是 -path "test" -a -prune -o -print 的简写表达式按顺序求值, -a 和 -o 都是短路求值,与 shell 的 && 和 || 类似如果
-path "test" 为真,则求值 -prune , -prune 返回真,与逻辑表达式为真;否则不求值 -prune,与逻辑表达式为假。如果 -path "test" -a -prune 为假,则求值 -print ,-print返回真,或逻辑表达式为真;否则不求值 -print,或逻辑表达式为真。
这个表达式组合特例可以用伪码写为:
if -path "test" then
-prune
else
2.12 忽略多个文件夹
[root@test test]# find .
.
./catTest
./catTest/f3
./findTest
./findTest/F1
./findTest/2rd
./findTest/2rd/F1
./findTest/2rd/f3
./nlTest
./nlTest/f1
./lessTest
./lessTest/history.log
./lessTest/Kconfig
./headTest
[root@test test]# find . \( -path ./findTest -o -path ./catTest \) -a -prune -o -print
.
./nlTest
./nlTest/f1
./lessTest
./lessTest/history.log
./lessTest/Kconfig
./headTest