日期:2022年12月2日标签:Developer

linux 中的 find 命令 #

find 用法:

$ find --help
Usage: find [-H] [-L] [-P] [-Olevel] [-D debugopts] [path...] [expression]
...

表示在某个路径(path)下查找文件(文件夹)。

1、单独输入一个 find 会显示当前目录中所有文件及文件夹:

$ find
.
./app
./app/file1.txt
./app/file2.txt
./file1.txt
./file2.txt
./file3.txt

2、指定目录下查找

指定在 ./app/ 目录下查找文件:

$ find app/
app/
app/file1.txt
app/file2.txt

3、指定查找文件的类型为目录或者文件

使用 -type d 表示只查找目录,d 是 directory 的缩写,在当前目录查找所有目录:

$ find . -type d
.
./app

使用 -type f 表示只查找文件,f 是 file 的缩写。在当前目录查找所有文件:

$ find . -type f
./app/file1.txt
./app/file2.txt
./file1.txt
./file2.txt
./file3.txt

4、指定文件(夹)名称查找

使用 -name <name> 表示查找名称为 <name> 的文件(夹)。在当前目录以及子目录下查找名称为 file1.txt 的文件:

$ find . -type f -name file1.txt
./app/file1.txt
./file1.txt

名称支持通配符,但是必须用双引号包括:

$ find . -name "file*"
./app/file1.txt
./app/file2.txt
./file1.txt
./file2.txt
./file3.txt

5、按路劲查找

-path 表示按路径查找:

$ find . -path "*app/*"
./app/file1.txt
./app/file2.txt

6、组合查找: AND 和 OR 操作符

-or 表示或者的意思,下面的命令查找名称为 file1.txt 或者名称为 file2.txt 的文件(夹):

$ find . -name file1.txt -or -name file2.txt
./app/file1.txt
./app/file2.txt
./file1.txt
./file2.txt

-and 表示与(并且)的意思,下面的命令查找名称满足 file1* 并且是文件夹:

$ find . -name "file1*" -and -type d
./file1

7、忽略大小写

假设你要查找类型为 js 的文件,并且忽略后缀大小写,你可以这样做:

$ find . -name "*.js" -or -name "*.JS" -or -name "*.Js" -or -name "*.jS"

同样你也可以简单的在 name 前添加一个 i —— -iname,表示忽略大小写:

$ find .-iname "*.js"

前面提到的所有选项都支持在前面添加 i 来表示忽略大小写(case-insensitive)。

8、NOT 操作符

还可以增加更复杂的操作,使用 NOT 表示不是(否)的意思。查找名称为 *.js*.html 但是路径不是 *programs* 的文件(夹):

$ find . \( -name "*.js" -or -name "*.html" \) -and -not -path "*programs*"
./websites/simple/index.html
./websites/simple/code.js

9、删除查找的结果

可以使用 -delete 用来删除查找的结果,例如删除当前仓库中所有的 html 文件:

$ find . -name "*.html" -type f -delete

注意使用这个选项来删除文件夹,无法删除非空的文件夹,如果想要删除文件夹,例如我想删除目录下所有的 node_modules(在大型前端项目下,我经常有这个需求),可以这样做:

$ find . -name node_modules -type d | xargs rm -rf

(完)

目录