一 、find命令含义
find命令是Linux系统中最重要也是最常用定命令之一,find命令用于根据参数搜索和定位文件和目录定列表。find命令可以在多种情况下使用,比如你可以利用权限、用户、用户组、文件类型、日期、大小和其他可能的条件来查找文件。
需要注意的是:find会从指定的目录搜索,并递归的搜索子目录
二、find命令格式
find pathname -options [-print -exec -ok...] {} \;
pathname 表示find命令所查找的文件或者目录的路径,如果路径为空,则使用当前路径,
-print :find 命令将匹配的文件输出到标准输出
-exec:find命令对匹配的文件执行该参数给出的shell命令,相应命令的形式为'command' {} \;注意{} 和 \ 之间的空格
-ok:和-exec的作用相同,只不过以一种更为安全的形式来执行该参数给出的shell命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执· 行。
三、 find 命令的参数介绍以及实例
1. -name 选项:根据文件名查找文件
(1)查找当前目录下以.sh结尾的文件名
1 $ find . -name "*.sh" 2 ./learn/code/antdesign/demo1/node_modules/constants-browserify/build.sh 3 ./learn/code/antdesign/demo1/node_modules/cssstyle/scripts/run_tests.sh 4 ./learn/code/antdesign/demo1/node_modules/sockjs-client/build.sh 5 ./learn/code/antdesign/demo1/node_modules/coa/lib/completion.sh 6 ./learn/code/antdesign/demo1/node_modules/acorn-jsx/node_modules/acorn/bin/update_authors.sh 7 ./learn/code/antdesign/demo1/node_modules/buffer/bin/update-authors.sh 8 ./learn/Linux/let.sh 9 ./learn/Linux/conditon.sh 10 ./learn/Linux/ifelse2.sh 11 ./learn/Linux/variable.sh
(2)查找指定目录
2.-iname选项:根据文件名查找文件,但是会忽略大小写
查找当前目录下以t开头的文件,忽略大小写,并且不递归文件的目录
1 $ find /Users/wangqiaoling -iname "t*" -maxdepth 1 2 /Users/wangqiaoling/test 3 /Users/wangqiaoling/Test1
3.-inum选项:根据inode编号来查找文件
1 #查看inode编号 2 ls -i 3 3533098 1.sh 4 5 #查找inode编号是3533098的文件 6 $ find . -inum 3533098 7 ./1.sh
4.-perm选项:根据权限来查找文件
r --只读(4) w --写(2) x -- 执行(1),所以6是具有读写权限,7是具有读写执行所以权限
(1)第一种情况 -perm mode:查找文件权限正好符号mode的文件
#查找当前目录下权限为777的文件,且目录不递归
1 $ find . -perm 777 -maxdepth 1 2 ./1.sh
(2)第二种情况 -perm +mode:查找的文件部分权限符合mode,比如查找文件权限为644的文件,现在目录中有一个权限为444的文件,这样的文件就可以被选出
#查询当前目录中权限符合644的文件,且目录不递归,(只要文件的权限小于等于644就符合查找条件,例如查找的文件权限是444或者644就都符合查找的权限)
1 $ find . -perm +644 -maxdepth 1 2 . 3 ./.config 4 ./Music 5 ./.yarn 6 ./iCloud 云盘(归档) 7 ./learn 8 ./.vim 9 ./.baacloud 10 ./1.sh 11 ./.DS_Store 12 ./.yarnrc 13 ./.CFUserTextEncoding 14 ./.idm 15 ./test
(3)第三种情况 -perm -mode:查找的文件权限完全符合mode,或者是超过了mode的权限,例如你查找的文件权限是644,有一个文件的权限是777,该文件也符合查找的情况,也就是当前文件已经拥有指定的权限,并且还有额外的权限。
ls -lrt 1.sh -rwxrwxrwx 1 wangqiaoling staff 829 4 20 15:12 1.sh $ find . -perm -666 -maxdepth 1 ./1.sh
5.-user 选项:根据文件属主查找文件
#查看文件1.sh的文件属主是wangqiaoling
1 $ ls -lrt 1.sh 2 -rwxrwxrwx 1 wangqiaoling staff 829 4 20 15:12 1.sh #查找文件属主是wangqiaoling的文件 4 $ find . -user wangqiaoling -maxdepth 1 5 ./1.sh
6.! -user选项:查找不属于属主的文件 --需要注意的是:! 和 -user 之间是有空格的
1 $ ls -lrt 1.sh 2 -rwxrwxrwx 1 wangqiaoling staff 829 4 20 15:12 1.sh
#查找属主不是wangqiaoling的文件,
3 $ find . ! -user wangqiaoling -maxdepth 1
7. -nouser 选项:查找无有效拥有者的文件,即文件的属主不在/etc/passwd文件中
1 $ find . -nouser #我的系统中不存在这样的文件,所以没找到
8.-group选项:按照组查找文件
#文件test的所属组是staff
1 $ ls -l test 2 -r--r--r-- 1 wangqiaoling staff 44361 5 4 13:48 test #查找以te开头的文件,并且所属组是staff的文件 4 $ find . -name "te*" -group staff -maxdepth 1 5 ./test
#查找以te开头的文件,并且所属组是wangqiaoling的文件,输出的结果是wangqiaoling: no such group,因为本身就不存在这个所属组,所以显示为没有这个数组
7 $ find . -name "te*" -group wangqiaoling -maxdepth 1 8 find: -group: wangqiaoling: no such group
9.! -group 选项:查找不属于某个所属组的文件
#查找不属于所属组是staff的文件
1 $ find . -name "te*" ! -group staff -maxdepth 1
#本身不存在的数组会报错 --wangqiaoling 这个所属组不存在
$ find . -name "te*" ! -group wangqiaoling -maxdepth 1
find: -group: wangqiaoling: no such group
10.-nogroup选项:查找无效所属组的文件,即文件的分组在/etc/passwd中不存在
1 $ find . -nogroup #我的系统中不存在这样的文件,所以没找到
以下为find命令按照文件时间查找
系统时间分为三个选项 :Access(atime) 、modity(mtime)、change(ctime)
Access(atime) --指的是文件最后被访问的时间,使用cat命令查看文件后,这个值会发生变化
modity(mtime) --指的是文件内容发生修改的最后时间,但是不包括修改文件权限等
change(ctime) -- 指文件最后被变更的时间,这个变更指的是文件内容发生修改、或者是文件权限、路径发生修改,文件被变更指的是文件状态发生了变化
11. -atime -n [+n]选项:查找n天之内【之前】被访问过的所有文件
1 #查看当前目录的文件 2 $ ls -lrt 3 total 128 4 drwx------+ 3 wangqiaoling staff 96 8 11 2018 Pictures 5 drwx------+ 3 wangqiaoling staff 96 8 11 2018 Movies 6 drwxr-xr-x+ 5 wangqiaoling staff 160 8 11 2018 Public 7 drwxr-xr-x 4 wangqiaoling staff 128 12 27 22:29 WebstormProjects 8 drwxr-xr-x 12 wangqiaoling staff 384 12 29 23:56 learn 9 drwxr-xr-x 5 wangqiaoling staff 160 1 6 21:46 IdeaProjects 10 drwx------+ 7 wangqiaoling staff 224 3 10 12:06 Music 11 drwx------ 4 wangqiaoling staff 128 3 18 20:20 iCloud 云盘(归档) 12 drwx------+ 5 wangqiaoling staff 160 3 31 09:47 Documents 13 -rwxrwxrwx 1 wangqiaoling staff 829 4 20 15:12 1.sh 14 -rw-r--r-- 1 wangqiaoling staff 218 4 20 18:29 2.3.5.sh 15 -rw-r--r-- 1 wangqiaoling staff 177 4 20 19:28 2.3.6.sh 16 -rw-r--r-- 1 wangqiaoling staff 134 4 21 21:06 2.4.2.sh 17 -r--r--r-- 1 wangqiaoling staff 44361 5 4 13:48 test 18 drwx------+ 22 wangqiaoling staff 704 5 4 14:21 Desktop 19 drwx------@ 70 wangqiaoling staff 2240 5 4 16:20 Library 20 drwx------+ 23 wangqiaoling staff 736 5 4 21:21 Downloads 21 -rw-r--r-- 1 wangqiaoling staff 7 5 6 22:08 Test1 22 #查看当前目录下2天之内被访问的文件 23 $ find . -atime -2 -maxdepth 1 24 . 25 ./Music 26 ./.DS_Store 27 ./.CFUserTextEncoding 28 ./.idm 29 ./test 30 31 #查看当前目录下2天之前被访问的文件 32 find . -atime +2 -maxdepth 1 33 ./.config 34 ./.yarn 35 ./iCloud 云盘(归档) 36 ./learn
12. -amin -n [+n]选项:查找n分钟之内【之前】被访问过的所有文件
#查找当前目录下2分钟之内被访问过的文件 $ find . -amin -2 -maxdepth 1 ./.CFUserTextEncoding
#查找当前目录下2分钟之前被访问过的文件
$ find . -amin +2 -maxdepth 1
./.config
./Music
./.yarn
13. -ctime -n [+n]选项:查找n天之内【之前】文件状态被修改过的所有文件
1 #查看当前目录下2天之内被修改过状态的文件 2 $ find . -ctime -2 -maxdepth 1 3 . 4 ./.idm 5 ./test 6 ./Test1 7 ./Desktop 8 ./.bash_sessions 9 ./.Trash 10 ./.bash_history 11 ./.viminfo 12 13 14 #查看当前目录下2天之前被修改过状态的文件 15 $ find . -ctime +2 -maxdepth 1 16 ./.config 17 ./Music 18 ./.yarn 19 ./iCloud 云盘(归档) 20 ./learn 21 ./.vim 22 ./.baacloud 23 ./.yarnrc 24 ./.CFUserTextEncoding 25 ./.zshrc 26 ./Pictures 27 ./2.3.5.sh
14. -cmin -n [+n] 选项:查找n分钟之内【之前】文件状态被修改过的所有文件
1 #查找当前目录中2分钟之内被修改过的文件 2 3 $ find . -cmin -2 -maxdepth 1 4 #查找当前目录中2分钟之前被修改过的文件 5 $ find . -cmin +2 -maxdepth 1
15. -mtime -n [+n]选项:查找n天之内【之前】文件内容被修改过的所有文件
1 #查找当前目录中5分钟之前被修改过的文件 2 $ find . -mmin -5 -maxdepth 1 3 . 4 ./Test1 5 ./.viminfo
16.-mmin -n [+n] 选择:查找n分钟之内【之前】文件内容被修改过的所有文件
1 #查找当前目录下5分钟之内被修改过内容的文件 2 $ find . -mmin -5 -maxdepth 1
17. -maxdepth n 选项:(n表示指定遍历搜索的最大深度)按照指定目录的深度查找文件,后面的参数n表示距当前目录指定的深度,其中1表示当前目录,2表示一级子目录,依次类推,在指定该选项后,find命令查找到指定深度后就不在递归子目录了,如果find命令不设置这个选项,将递归查询当前目录下的所以子目录
#查找当前目录下文件名以't'开头的文件,深度是1 find . -name "t*" -maxdepth 1 ./test
18.-mindepth n 选项:(n表示指定开始搜索的最小深度 )按照指定目录的深度查找文件,从n级目录开始搜索,直到遍历完从n开始的所有子目录
1 $ find . -name "t*" -mindepth 2
19.-depth n 选项:(n表示开始搜索的最小深度)按照指定目录的深度查找文件,在处理目录之前先处理子目录下的子内容,如果不加-depth选项,处理查找的顺序就是首先处理目录本身,然后在处理目录下的子内容,如果不加-depth会影响输出的顺序


1 #不加-depth 选项 2 $ find test 3 test 4 test/test.tar 5 test/testfile1 6 test/.DS_Store 7 test/test1 8 test/test1/a 9 test/test1/b 10 test/testfile2 11 test/testfile3 12 test/test2 13 test/testfile 14 test/testfile/2.txt 15 test/testfile/1.txt 16 17 #加-depth选项,会首先处理子目录的子内容 18 $ find test -depth 19 test/test.tar 20 test/testfile1 21 test/.DS_Store 22 test/test1/a 23 test/test1/b 24 test/test1 25 test/testfile2 26 test/testfile3 27 test/test2 28 test/testfile/2.txt 29 test/testfile/1.txt 30 test/testfile 31 test 32 33 34 #从一级目录开始查询 35 $ find test -depth 1 36 test/test.tar 37 test/testfile1 38 test/.DS_Store 39 test/test1 40 test/testfile2 41 test/testfile3 42 test/test2 43 test/testfile
20.-path 选项:排除指定子目录查找文件
命令格式:-path -pathname -prune (排除子目录pathname后进行查找)
或者 -path expression -prune(排除表达式中的一组pathname后进行查找)
-prune 参数的介绍:
$ find . -path "./test1" -prune -o -name "a*"
其中-prune参数,类似于if判断,如果-prune之前的语句为真,就不执行-o后面的-name语句,如果没有找到,就执行-o后面的-name语句,这样就达到了排除子目录的效果
find命令中-path后的路径不能多加一个'/',加上之后就成了绝对路径,path之后只能用相对路径,但是find后的紧接着的路径只能是绝对路径,除了当前的目录'.'外
忽略一个文件夹
1 #查看当前目录下以'a' 开头的文件 2 $ find . -name "a*" 3 ./test1/a 4 ./test2/aa 5 6 #除去目录test1后,进行查找文件,查找'a' 开头的文件,最后查到的文件只有文件夹test2中的,没有test1中的文件 7 $ find . -path "./test1" -prune -o -name "a*" 8 ./test1 9 ./test2/aa 10 11 #错误的除去test1目录的例子如下 12 $ find . -path "./test1/" -prune -o -name "a*" 13 ./test1/a 14 ./test2/aa 15 16 $ find . -path "test1/" -prune -o -name "a*" 17 ./test1/a 18 ./test2/aa
忽略多个文件夹
1 #忽略多个文件夹,本身就有两个文件夹test1和test2文件夹中有a开头的文件,两个目录都忽略之后,就不会查到文件,代码如下 2 $ find . -path "./test1" -prune -o -path "./test2" -prune -o -name "a*" 3 ./test1 4 ./test2
21.-type选项:按照文件类型来查找文件
文件类型有6种,分别是
b --块设备文件
d -- 目录
c --字符设备文件
p --管道
l --符号链接文件
f --普通文件
1 #查看当前目录下的普通文件 2 $ find . -type f 3 ./let.sh 4 ./conditon.sh 5 ./ifelse2.sh 6 ./variable.sh 7 8 #查看当前目录下的目录文件夹 9 find . -type d 10 . 11 ./test 12 ./test/test1 13 ./test/test2 14 ./test/testfile 15 ./awk
22.-size 选项:按照文件大小来查找文件
命令格式:-size [+/-] n [c/k/M/G] :表示文件的大小等于【大于/小于】n块【字节/k/M/G】的文件
1 #查找当前目录中文件大小大于4k的文件 2 find . -size +4k 3 ./.DS_Store 4 ./test/test.tar 5 ./test/.DS_Store 6 7 #查找当前目录中文件大小小于4k的文件 8 $ find . -size -4k 9 . 10 ./let.sh 11 ./conditon.sh 12 ./ifelse2.sh 13 14 #查找当前目录中文件大小等于4k的文件 15 $ find . -size 4k
23.-empty 选项:查找空文件
1 #查找空文件 2 $ find . -empty 3 ./list.err
24.逻辑运算符
-a :and,与运算
-o:or,或运算
-not:not,非运算
(1) -a:find命令支持与运算,也就是-a的两个条件都成立,搜索的结果才成立
1 #查找当前目录下文件大小大于3k,并且是普通类型的文件,目录不递归查询 2 $ find . -size +3k -a -type f -maxdepth 1 3 ./.DS_Store 4 ./test 5 ./.bash_history 6 ./.viminfo
(2)-o :find 命令支持或运算,也就是-o的其中一个条件成立,find命令就能找到结果
#查找当前目录下文件大小大于3k,或者文件类型是普通文件的所有文件,当前目录不递归 $ find . -size +3k -o -type f -maxdepth 1 ./1.sh ./.DS_Store ./.yarnrc ./.CFUserTextEncoding ./test ./.zshrc ./Test1 ./2.3.5.sh ./.lesshst ./.node_repl_history ./2.3.6.sh ./.bash_sessions ./.vimrc ./.mysql_history ./.bash_profile ./.rediscli_history ./.inputrc ./.bash_history ./.viminfo ./2.4.2.sh
(3)-not:find命令也支持逻辑非的匀速哪,也就是取反的意思
1 #查找当前目录下文件名不是以'test'开头的所以文件,当前目录不递归 2 $ find . -not -name "test*" -maxdepth 1 3 . 4 ./.config 5 ./Music 6 ./.yarn
25.查询完之后的操作
(1)-exec command {} \; 其中,‘{}’就代表查找到之后返回的文件
1 #查询完进行用ls命令显示详细的信息 2 $ find . -name "a*" -exec ls -lrt {} \; 3 -rw-r--r-- 1 wangqiaoling staff 4 12 26 17:30 ./test/test1/a 4 -rw-r--r-- 1 wangqiaoling staff 4 5 7 18:34 ./test/test2/aa 5 total 16 6 -rw-r--r-- 1 wangqiaoling staff 1 12 3 17:26 awk1.sh 7 -rw-r--r-- 1 wangqiaoling staff 34 12 26 14:54 test.txt 8 -rw-r--r-- 1 wangqiaoling staff 1 12 3 17:26 ./awk/awk1.sh 9 -rw-r--r-- 1 wangqiaoling staff 355 12 2 20:50 ./array.sh 10 -rw-r--r-- 1 wangqiaoling staff 394 12 3 15:16 ./arrayErgodic.sh
(2)-ok command {} \; -ok相对于-exec而言更为安全一点,会让用户确定所要执行的操作
1 $ find . -name "a*" -ok ls -lrt {} \; 2 "ls -lrt ./test/test1/a"? yes 3 -rw-r--r-- 1 wangqiaoling staff 4 12 26 17:30 ./test/test1/a 4 "ls -lrt ./test/test2/aa"? yes 5 -rw-r--r-- 1 wangqiaoling staff 4 5 7 18:34 ./test/test2/aa 6 "ls -lrt ./awk"? y 7 total 16 8 -rw-r--r-- 1 wangqiaoling staff 1 12 3 17:26 awk1.sh 9 -rw-r--r-- 1 wangqiaoling staff 34 12 26 14:54 test.txt 10 "ls -lrt ./awk/awk1.sh"? y 11 -rw-r--r-- 1 wangqiaoling staff 1 12 3 17:26 ./awk/awk1.sh 12 "ls -lrt ./array.sh"? y 13 -rw-r--r-- 1 wangqiaoling staff 355 12 2 20:50 ./array.sh 14 "ls -lrt ./arrayErgodic.sh"?
四、实例
1.查找主目录下文件名以1开头的文件
1 $ find ~ -name "1*" -maxdepth 1 2 /Users/wangqiaoling/1.sh
2.查找当前目录下的可执行文件
1 $ find . -type f -perm 777 -maxdepth 1 2 ./1.sh 3 ./Test1
3.查找当前目录下,30天之前60天以内被被修改过的所有文件
1 find . -mtime +30 -mtime -60 -maxdepth 1 2 ./Music 3 ./iCloud 云盘(归档) 4 ./.CFUserTextEncoding 5 ./Documents 6 ./.rediscli_history
4.查找当前目录下,文件大小大于10K小于20K的所有文件
1 $ find . -size +10k -size -20k -maxdepth 1 2 ./.viminfo
转载于:https://www.cnblogs.com/start-wang/p/10817775.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/bian-cheng-ji-chu/100027.html