Linux 上的
find
命令是findutil
软件包的一部分,通常已经默认集成在了几乎全部的发行版中。
find 命令有很是大的灵活性,能够向其指定丰富的搜索条件(如文件权限、属主、属组、文件类型、日期和大小等)来定位系统中的文件和目录。
此外,find 还支持对搜索到的结果进行多种类型的命令操做。python
find 命令的基本结构以下:find [paths] [expression] [actions]
linux
find 命令接受一个或多个路径(paths)做为搜索范围,并在该路径下递归地搜索。即检索完指定的目录后,还会对该目录下的子目录进行检索,以及子目录下的子目录。。。直到到达目录树底部。express
默认状况下(不带任何搜索条件),find 命令会返回指定目录下的全部文件,因此经常须要经过特定的 expression
对结果进行筛选。ruby
find 命令默认的 action
是将全部检索结果打印至标准输出。能够经过自定义 action
,让 find 命令对搜索到的结果执行特定的操做。ide
这里先不作详细解释,简单地测试下 find 命令:测试
$ tree directory
directory
├── file1
├── file2
├── sub-dir1 │ ├── file1 │ ├── file2 │ └── file3 └── sub-dir2 ├── file2 └── sub-subdir1 └── file1 3 directories, 7 files
$ find directory directory directory/sub-dir1 directory/sub-dir1/file3 directory/sub-dir1/file2 directory/sub-dir1/file1 directory/file2 directory/sub-dir2 directory/sub-dir2/file2 directory/sub-dir2/sub-subdir1 directory/sub-dir2/sub-subdir1/file1 directory/file1
$ find directory -name file2 directory/sub-dir1/file2 directory/file2 directory/sub-dir2/file2
-delete
表示删除搜索结果)$ find directory -name file2 -delete $ find directory directory directory/sub-dir1 directory/sub-dir1/file3 directory/sub-dir1/file1 directory/sub-dir2 directory/sub-dir2/sub-subdir1 directory/sub-dir2/sub-subdir1/file1 directory/file1
find 命令中的 -name
选项能够根据文件名称进行检索(区分大小写)。如须要忽略文件名中的大小写,可使用 -iname
选项。ui
-name
和 -iname
两个选项都支持 wildcards 。如:spa
?
能够表示任意一个单一的符号*
能够表示任意数量(包括 0)的未知符号find /usr -name '*.txt'
查找 /usr 目录下全部文件名以 .txt
结尾的文件find /usr -name '????'
查找 /usr 目录下全部文件名恰好为 4 个字符的文件code
有些时候,你须要在搜索时匹配某个文件或目录的完整路径,而不只仅是匹配文件名。可使用 -path
或 -ipath
选项。blog
如查找 /usr 下全部文件名以 .txt
结尾的文件或目录,且该文件的父目录必须是 src
。可使用如下命令:find /usr -path '*/src/*.txt'
若是只想搜索获得文件或目录,即不想它们同时出如今结果中。可使用 -type
选项指定文件类型。
-type
选项最经常使用的参数以下:
find /usr -type d -name 'python*'
检索 /usr 下全部文件名以 python
开头的目录
find 命令支持 -empty
选项用来检索为空的文件或目录。空文件即文件里没有任何内容,空目录即目录中没有任何文件或子目录。
find ~ -type d -empty
检索用户主目录下全部的空目录
find 命令也容许用户对当前的匹配条件进行“反义”(相似于逻辑非操做)。
如须要检索 /usr 下全部文件名不以 .txt
为后缀的文件。可使用如下命令:find /usr -type f ! -name '*.txt'
也能够“翻转”任何其余的筛选条件,如:find /usr -type f ! -empty
检索 /usr 下全部内容不为空的文件
为了检索归属于特定用户的文件或目录,可使用 -user
选项。
find / -type f -user starky
检索根目录下全部属主为 starky 的文件
相似于 -user
选项,-group
选项则能够根据文件或目录的属组进行检索。
有些时候,须要根据文件建立或修改的时间进行检索。
Linux 系统中,与文件相关联的时间参数有如下三种:
与此对应的是 find 命令中的 -mtime
,-atime
和 -ctime
三个选项。
这三个选项的使用遵循如下示例中的规则:
-mtime 2
:该文件 2 天前被修改过-mtime -2
:该文件 2 天之内被修改过-mtime +2
:该文件距离上次修改已经超过 2 天时间find /usr -type f -mtime 2
检索 /usr 下两天前被修改过的文件
若是以为 -mtime
等选项以天为单位时间有点长,还可使用 -mmin
,-amin
,-cmin
三个选项:find /usr -type f -mtime +50 -mtime -100
检索 /usr 下 50 到 100 天以前修改过的文件find /usr -type f -mtime 2 -amin 5
检索 /usr 下两天前被修改过且 5 分钟前又读取过的文件
-size
选项容许用户经过文件大小进行搜索(只适用于文件,目录没有大小……)。
表示文件大小的单位由如下字符组成:
c
:字节k
:KbM
:MbG
:Gb另外,还可使用 +
或 -
符号表示大于或小于当前条件。
find / -size +1G
检索文件大小高于 1 GB 的文件
find 命令可使用 -perm
选项以文件权限为依据进行搜索。
如须要检索 /usr 目录下权限为 rwxr-xr-x
的文件,可使用如下命令:find /usr -perm u=rwx,g=rx,o=rx
搜索 /usr 目录下全部权限为 r-xr-xr-x
(即系统中的全部用户都只有读写权限)的文件和目录,可使用如下命令:find /usr -perm a=rx
不少时候,咱们只想匹配文件权限的一个子集。好比,检索能够直接被任何用户执行的文件,即只关心文件的执行权限,而不用管其读写权限是什么。
上述的需求能够经过如下命令实现:find / -type f -perm /a=x
其中 a=x
前面的 /
符号即用来表示只匹配权限的某个子集(执行权限),而不用关心其余权限的具体设置。
-perm
选项也支持数字形式的文件权限标记。
find /usr -perm 644
搜索 /usr 目录下权限为 644(即 rwxr-xr-x
)的文件
find 命令默认是以递归的方式检索项目的,这有时候会致使获得的结果数量很是巨大。可使用 -maxdepth
限制 find 命令递归的层数。
find / -maxdepth 3
搜索时向下递归的层数最大为 3
在以前的例子中有出现多个搜索条件的组合以及对某个搜索条件的反转。
实际上 find 命令支持 “and” 和 “or” 两种逻辑运算,对应的命令选项分别是 -a
和 -o
。经过这两个选项能够对搜索条件进行更复杂的组合。
此外还可使用小括号对搜索条件进行分组。注意 find
命令中的小括号常须要用单引号包裹起来。因小括号在 Shell 中有特殊的含义。
如检索 /usr 下文件名以 python
开头且类型为目录的文件find /usr -type d -name 'python*'
该命令等同于:find /usr -type d -a -name 'python*'
更复杂的组合形式如:find / '(' -mmin -5 -o -mtime +50 ')' -a -type f
-delete
选项能够用来删除搜索到的文件和目录。
如删除 home 目录下全部的空目录:find ~ -type d -empty -delete
-exec
选项能够对搜索到的结果执行特定的命令。
如须要将 home 目录下全部的 MP3 音频文件复制到移动存储设备(假设路径是 /media/MyDrive
),可以使用下面的命令:find ~ -type f -name '*.mp3' -exec cp {} /media/MyDrive ';'
其中的大括号({}
)做为检索到的文件的 占位符 ,而分号( ;
)做为命令结束的标志。由于分号是 Shell 中有特殊含义的符号,因此须要使用单引号括起来。
每当 find 命令检索到一个符合条件的文件,会使用其完整路径取代命令中的 {}
,而后执行 -exec
后面的命令一次。
另外一个很重要的用法是,在多个文件中检索某个指定的字符串。
如在用户主目录下的全部文件中检索字符串 hello
,可使用以下命令:find ~ -type f -exec grep -l hello {} ';'
建立 Gzip 格式的压缩文件的命令为:tar -czvf filename.tar.gz <list of files>
如今假设须要将用户主目录下全部的 MP3 文件添加到压缩包 music.tar.gz
中,直观的感受是,其命令应为以下形式:find ~ -type f -name '*.mp3' -exec tar -czvf music.tar.gz {} ';'
实际状况是,这样获得的 music.tar.gz
其实只包含一个 MP3 文件。
缘由是 find 命令每次发现一个音频文件,都会再执行一次 -exec
选项后面的压缩命令。致使先前生成的压缩包被覆盖。
能够先让 find 命令检索出全部符合条件的音频文件,再将获得的文件列表传递给后面的压缩命令。完整的命令以下:find ~ -type f -name '*.mp3' -exec tar -czvf music.tar.gz {} +
若是想浏览搜索到的文件(目录)的详细信息(如权限和大小等),能够直接使用 -ls
选项。
find / -type file -size +1G -ls
浏览全部 1G 以上大小的文件的详细信息
参数 | 解析 |
---|---|
-atime n[smhdw] | 距离文件上次被访问时的时间间隔 |
-ctime n[smhdw] | 距离文件建立时的时间间隔 |
-delete | 删除检索到的文件 |
-depth n | 检索深度为 n 的文件,即位于指定目录如下 n 层的文件 |
-empty | 检索空文件或空目录 |
-fstype type | 指定文件所在的文件系统的类型 |
-group gname | 指定文件的属组 |
-iname pattern | 同 -name ,忽略大小写 |
-ipath pattern | 同 -path ,忽略大小写 |
-ls | 打印搜索到的文件的详细信息 |
-maxdepth n | 指定递归的最大层数为 n |
-mtime n[smhdw] | 距离文件上次发生变动时的时间间隔 |
-name pattern | 搜索时使用 pattern 对文件名进行匹配 |
-path pattern | 搜索时使用 pattern 对文件路径进行匹配 |
-perm mode | 根据文件权限搜索 |
-size n[ckMGTP] | 根据文件大小搜索 |
-type t | 根据文件类型搜索 |
-user uname | 指定文件的属主 |
A Guide to the Linux “Find” Command
find 命令手册:man find