Linux命令 | 常用命令之 find
Linux命令 | 常用命令之 find
目录
我们在使用 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
更多推荐
所有评论(0)