Linux -- find命令

  一 、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
View Code

     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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值