写在前面
在类unix操作系统中,find命令用于一个或多个目录树中查找文件。本文不会详细介绍find命令的用法,因为man find
足以告诉我们这些信息。本文只是我的一个学习笔记,记录一下自己的学习过程及归类总结find的一些常用命令。
用法简述
find命令基本结构:
find [-H] [-L] [-P] [-D debugopts] [-Olevel] [path...] [expression]
path可以是一个或多个目录,这里最主要的是express,expression可以由options,tests和actions,翻译成人话就是可以按照多个维度自由组合查找条件,再在这些查找出来的文件中执行actions操作。
从查找的维度来说包括:
- 文件名(可以通过正则匹配)
- 文件类型
- 文件大小
- 时间
- 组和用户
- 访问权限
- 目录层级
- 符号链接
我们可以按照以上条件自由组合查找目标文件,一旦过滤出这些文件,我们可以执行常用的一些actions:
- 打印
- 文件操作(复制、移动、重全名、删除等)
- 修改文件权限
- 修改文件用户组
常用实例
1. 在指定目录下查找文件
在根目录下搜索名为passwd
的文件:
shell> find / -type f -name 'passwd'
其中,-type
表示根据文件类型查找f
表示普通文件,更多类型请man find
,-name
表示从文件名进行匹配,后面可以用正则表达式,这里用了最简单的字符串匹配。如果忽略文件名大小写,用-i
参数:
shell> find / -type f -iname 'passwd'
2.在指定目录下查找文件大于200M的文件
shell> find / -size +200M
其中-size
参数表示从文件大小维度进行查找,后接口文件大小,和单位,默认是块(512 byte),文件大小前可以带+
或-
表示范围大于,小于,不带表示等于。
文件大小单位包括:
单位 | 说明 |
---|---|
b | 块,512字节为一块 |
c | 字节 |
w | 双字,2字节为一字 |
k | 千字节,1024字节 |
M | 兆,1024k |
G | 吉,1024M |
3.根据时间查找
根据时间维度查找又可以分为三个子维度条件进行查找,如下:
操作 | Meaning | 查找参数 |
---|---|---|
访问(access) | 读取文件内容时记录的时间 | -atime,-amin |
修改(modification) | 修改文件内容时记录的时间 | -mtime,-mmin |
修改状态(change of status) | 修改文件名或文件属性(权限、拥有者等) | -ctime,-cmin |
查找15分钟之前修改的文件:
shell> find . -type f -amin +15
查找1天前修改的文件:
shell> find . -type f -atime +1
按照访问时间、修改状态时间查找类似;除此之外还可以以一个文件的基准,查找比这个文件修改时间更新的文件:
shell> find . -type f -newer test.txt
4.根据用户或组维度查找文件
查找属于sedlav
的文件
shell> find . -type f -user sedlav
查找属于mysql组的文件夹:
shell> find / -type d -group mysql
5.根据访问权限查找文件
权限表示完全跟用户、组、其它用户表示权限的方法一致:
Perm | Octal | Symbolic |
---|---|---|
Read | 4 | r |
Write | 2 | w |
Execute | 1 | x |
查拥有者和组用户具有读写权限,其它用户拥有读权限的文件:
shell>find . -type -perm 644
6. 在指定目录层级中查找
可以指定查找的具体的目录层级,或目录层级范围:
参数 | 说明 |
---|---|
-depth levels | 目录层级 |
-maxdepth levels | 最小目录层级 |
-mindepth levels | 最大目录层级 |
从根目录开始,最多查找3层,查找名为passwd
的文件:
shell> find / -maxdepth 3 -name 'passwd'
7.过滤错误信息
如果你没有root权限,在/
目录下执行上例命令时,你会看到很多错误信息,如何将这些错误信息过滤掉呢?只需要交错误信息重定向到/dev/null中就可以了:
shell> find / -maxdepth 3 -name 'passwd' 2>/dev/null
8. 重命名查找出的文件
根据上面例子中的各种维度,我们可以筛选出目标文件,然后在目录文件上执行actons操作,默认情况下执行的是print
,即将目标文件打印出来,除此之外,我们可以使用-exec
参数执行更多操作,如:
将当前目录下所有后缀为.php
的文件备份到/tmp
目录下:
shell>find . -type f -iname '*.php' -exec cp {} /tmp \;
将当前目录下所有的后缀为.htm
文件重命名为后缀.html
:
shell> find . -type f -iname '*.htm' -exec sh -c 'mv {} $(basename {} .htm).html' \;
将当前目录下,所有mp3文件名中的空格(blank)替换为下划线_
:
shell> find . -type f -iname “*.mp3″ -exec rename “s/ /_/g” {} \;
更多参考
3.https://www.thegeekstuff.com/2009/03/15-practical-linux-find-command-examples/
网友评论