目录

一、基本概念

二、语法形式及常用参数

2.1 语法形式

2.2 常用参数

三、实例讲解

3.1 -name/-iname 参数

3.2 -type 参数

3.3 -ctime 参数

3.4 -cnewer 参数

3.5 -exec/-ok 参数

 四、总结

五、参考文献


我们在使用 Linux 的时候,查找文件经常使用的一个命令就是 find,了解 find 的功能以及使用可以加强工作效率,下面结合具体实例介绍下 find 的用法。

一、基本概念

find 命令用于在指定目录及子目录下查找文件(指普通文件和目录)。

二、语法形式及常用参数

2.1 语法形式

find [path...] [expression]

其中,path 为查找路径,多个 path 使用空格分隔;expression : 由选项和动作组成。

2.2 常用参数

-name pattern : 根据指定模式查找文件;

-iname pattern : 同-name 参数,区别是不区分大小写;

-type c :根据文件类型 c 查找文件;

其中:c 代表文件类型,可取值为:

          d : 目录;

          f : 普通文件;

          l : 符号链接;

          s : 套接字;

          c : 特殊字符文件;

          b : 特殊块文件;

          p : 命令管道(FIFO)

-ctime n : 查找过去 n 天内修改过的文件;

-cnewer file :  查找比文件 file 更新的文件(“更新”:指的是修改时间);

-exec commond {} \; : 对查找到的文件执行该参数所列出的 shell 命令,注意 {}和 \之间有一个空格;

-ok commond {} \; : 功能以及参数模式同 -exec,但是每次执行 commond 都会询问用户是否执行,输入 Y/N 选择。

三、实例讲解

3.1 -name/-iname 参数

首先,在当前目录下创建文件 readme.md,然后查找文件名符合模式 “*README.md” 的文件。 

[root@localhost go]# touch readme.md
[root@localhost go]# find . -name "*README.md"
./README.md
./misc/trace/README.md
./src/cmd/compile/README.md
./src/cmd/compile/internal/ssa/README.md
./src/cmd/vendor/github.com/google/pprof/third_party/d3/README.md
./src/cmd/vendor/github.com/ianlancetaylor/demangle/README.md
./src/cmd/vendor/golang.org/x/sys/unix/README.md
./test/README.md
[root@localhost go]# 

 从上面的例子中可以看到,满足pattern为 “*README.md” 的文件都被查找出来了,但是小写的文件 readme.md 没有被查询出来。下面看下换成参数 -iname 的结果:

[root@localhost go]# find . -iname "*ME.md"
./README.md
./misc/trace/README.md
./src/cmd/compile/README.md
./src/cmd/compile/internal/ssa/README.md
./src/cmd/vendor/github.com/google/pprof/third_party/d3/README.md
./src/cmd/vendor/github.com/ianlancetaylor/demangle/README.md
./src/cmd/vendor/golang.org/x/sys/unix/README.md
./test/README.md
./readme.md
[root@localhost go]#

可以看到,小写的文件 readme.md 也被查找出来了,这就是 -name 和  -iname 的区别。

PS: 在 Linux 中 i 参数经常代表命令不区分大小写的意思。

3.2 -type 参数

查找所有名字为 “*src” 的目录。 

[root@localhost go]# find . -type d -name "*src"
./src
./src/cmd/api/testdata/src
./src/cmd/go/testdata/modlegacy/src
./src/cmd/internal/src
./src/cmd/link/testdata/testPErsrc
./src/go/build/testdata/withvendor/src
[root@localhost go]#

从上面的例子可以看到,所有符合模式 “*src” 的目录都被显示出来了,没有列出符合条件的普通文件。 

 查找所有名字为 “*src” 的文件。

[root@localhost go]# find . -type f -name "*src"
./src/cmd/compile/internal/syntax/testdata/issue20789.src
./src/cmd/compile/internal/syntax/testdata/issue23385.src
./src/cmd/compile/internal/syntax/testdata/issue23434.src
./src/cmd/compile/internal/syntax/testdata/issue31092.src
./src/cmd/compile/internal/syntax/testdata/sample.src
./src/go/parser/testdata/commas.src
./src/go/parser/testdata/issue11377.src
./src/go/parser/testdata/issue23434.src
……

从上面的例子可以看到,所有符合模式“*src”的普通文件都被查找出来了,并不包含目录。 

3.3 -ctime 参数

 首先,在 /var/account 下先创建 testCtime 文件,然后在当前目录下查找最近一天修改过的文件。

[root@localhost account]# ls
pacct
[root@localhost account]# touch testCtime
[root@localhost account]# find . -ctime -1
.
./testCtime
[root@localhost account]#

从上面可以看到,"." 和 testCtime 都被查找出来了,其中,“.”  代表当前目录。

3.4 -cnewer 参数

首先,创建两个文件 testOne 和 testTwo,再创建一个目录 testdir,查找比 testOne 新的文件。

[root@localhost go]# touch testOne
[root@localhost go]# touch testTwo
[root@localhost go]# mkdir testdir
[root@localhost go]# find . -cnewer testOne
.
./testTwo
./testdir
[root@localhost go]#

从上述查询结果可以看出,可以查询出比 testOne 更新的文件

3.5 -exec/-ok 参数

在当前目录及子目录下查找符合模式 “README.md”的文件,查出的结果执行命令 ls -l 。 

[root@localhost go]# find . -name "README.md" -exec ls -l {} \;
-rw-r--r--. 1 root root 1607 9月  10 00:57 ./README.md
-rw-r--r--. 1 root root 5066 9月  10 00:57 ./misc/trace/README.md
-rw-r--r--. 1 root root 5655 9月  10 00:57 ./src/cmd/compile/README.md
-rw-r--r--. 1 root root 7945 9月  10 00:57 ./src/cmd/compile/internal/ssa/README.md
-rw-r--r--. 1 root root 2834 9月  10 00:57 ./src/cmd/vendor/github.com/google/pprof/third_party/d3/README.md
-rw-r--r--. 1 root root 98 9月  10 00:57 ./src/cmd/vendor/github.com/ianlancetaylor/demangle/README.md
-rw-r--r--. 1 root root 8678 9月  10 00:57 ./src/cmd/vendor/golang.org/x/sys/unix/README.md
-rw-r--r--. 1 root root 577 9月  10 00:57 ./test/README.md
[root@localhost go]# 

同上,将参数由 -exec 改为 -ok,执行如下: 

[root@localhost go]# find . -name "README.md" -ok ls -l {} \;
< ls ... ./README.md > ? y
-rw-r--r--. 1 root root 1607 9月  10 00:57 ./README.md
< ls ... ./misc/trace/README.md > ? y
-rw-r--r--. 1 root root 5066 9月  10 00:57 ./misc/trace/README.md
< ls ... ./src/cmd/compile/README.md > ? y
-rw-r--r--. 1 root root 5655 9月  10 00:57 ./src/cmd/compile/README.md
< ls ... ./src/cmd/compile/internal/ssa/README.md > ? y
-rw-r--r--. 1 root root 7945 9月  10 00:57 ./src/cmd/compile/internal/ssa/README.md
< ls ... ./src/cmd/vendor/github.com/google/pprof/third_party/d3/README.md > ? y
-rw-r--r--. 1 root root 2834 9月  10 00:57 ./src/cmd/vendor/github.com/google/pprof/third_party/d3/README.md
< ls ... ./src/cmd/vendor/github.com/ianlancetaylor/demangle/README.md > ? y
-rw-r--r--. 1 root root 98 9月  10 00:57 ./src/cmd/vendor/github.com/ianlancetaylor/demangle/README.md
< ls ... ./src/cmd/vendor/golang.org/x/sys/unix/README.md > ? N
< ls ... ./test/README.md > ? N
[root@localhost go]#

从上述例子中可以看到,每次执行 ls -l 命令都会询问是否执行。 

 四、总结

上面列举了 find 的常用参数,需要注意 find 的查找都是递归查找,例如:在当前目录下查找,会默认查找当前目录和子目录中的文件。

五、参考文献

[1] https://www.runoob.com/linux/linux-comm-find.html

[2] https://man7.org/linux/man-pages/man1/find.1.html

 

Logo

更多推荐