find
是 linux
里面一个非常常用且非常强大的命令了,学会了 find
,你对 linux
的哲学——“一切皆文件”了解会更深入。
顺便说下,面试问到 linux
,几乎都会问 find
。
功能
按照目录层级搜寻文件。find
的工作原理,是按照目录树来搜寻文件名。
需要注意的是,find
的参数很多,所以我会汇总各种参数风格放进来。
下面的例子,目录结构是这样的
A
|-- B
| |-- C
| | |-- D
| | `-- d
| `-- c
`-- b
A
、B
、C
、D
都是目录,b
、c
、d
都是文件
常用参数
-depth
# 参照
$ find A/
A/
A/B
A/B/C
A/B/C/D
A/B/C/d
A/B/c
A/b
# 本命令
$ find A/ -depth
A/B/C/D
A/B/C/d
A/B/C
A/B/c
A/B
A/b
A/
搜寻文件时,先处理目录下的文件,再处理目录。可以看到,没使用这个参数之前,find
会首先处理并打印出目录,然后再从深到浅打印出文件。使用后,则会从深到浅处理所有内容。
-maxdepth
-mindepth
# 举例
$ find A/ -maxdepth 3 -mindepth 2 -depth
A/B/C/D
A/B/C/d
A/B/C
A/B/c
搜寻文件时,指定最深层级和最浅层级
+n: >n
-n: <n
n: =n
这个参数很有意思,当我们对目标文件的属性有特殊要求时,可能会用这个参数配合其他的筛选条件使用。比如,当我们查找 7
天内被修改过的文件,可以用 find . -ctime -7
-atime: 访问时间
-ctime: 修改时间
-mtime: 修改属性时间
配合前面的 n
使用,可以按时间筛选文件
-size
# 例子
$ find . -type f -size +1k
./.bash_history
配合前面的 n
使用,可以按大小筛选文件。而且 n
有单位(附录1),比如例子就是查找大于 1k
的文件
-type
# 例子
$ find . -type f -size 1c
配合文件类型使用,我们知道,在 linux
中,一切皆文件,我们用“文件种类”来区分目录和普通文件呢。普通文件是 f
,目录是d
,文件种类的列表见附录2。
例子就是查找文件大小恰好是1字节的普通文件。
-user
-group
按照用户和用户来查找文件
-name
# 例子
$ find . -type f -name '12*'
按照文件名来查找,支持基础的正则。需要带上单引号,防止出现多文件问题。
前面说的都只是查找文件,find其实也可以针对查找的结果执行一些命令,这种参数我叫它“可执行参数”(自己起的)
特别注意,务必先验证一下你的find语句,然后再用可执行参数!
-delete
# 例子
$ find . -type f -size -1c -name 123 -delete
这个参数,就是查找并删除文件名是123,文件大小恰好1字节的普通文件
-exec
# 例子
$ find . -type f -name '12*' -exec ls -l {} ;
这个参数可以说是非常有用了!
-exec
后面跟的是 command
命令,考虑到不同系统可能对分号有不同的定义,所以以”空格+反斜杠+分号“的形式来作为结束。
{}
则是前面 find
得到的结果。
所以看例子,find . -type f -name '12*'
是搜索名字为12*
的普通文件,后面 -exec ls -l {} ;
拆分成 -exec
和 ls -l {}
和 ;
这么拆分一下,是不是简单明了?
-ok
# 例子
$ find . -type f -name '12*' -exec ls -l {} ;
跟 -exec
类似,但是在执行 command
前,会让你确认,所以虽然 -exec
考的多用的也多,我还是更推荐-ok
!
附录1
-size 的单位
'b' for 512-byte blocks (this is the default if no suffix is used)
'c' for bytes
'w' for two-byte words
'k' for Kilobytes (units of 1024 bytes)
'M' for Megabytes (units of 1048576 bytes)
'G' for Gigabytes (units of 1073741824 bytes)
附录2
文件种类列表
b block (buffered) special
c character (unbuffered) special
d directory
p named pipe (FIFO)
f regular file
l symbolic link; this is never true if the -L option or the -follow option is in effect, unless the sym-bolic link is broken. If you want to search for symbolic links when -L is in effect, use -xtype.
s socket
D door (Solaris)