每日一个linux命令17-find之查询篇01

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
-print

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

你可能感兴趣的:(每日一个linux命令17-find之查询篇01)