- find命令的一般使用格式
- find命令的常用选项和实例
find命令的一般使用格式
使用man命令查看find文档的内容,可以看到find命令的功能和使用格式。
根据帮助文档先来对find命令的一般格式做一个简单介绍。
find命令功能:在一个目录(及子目录)中搜索文件.
find命令使用格式:find[-H] [-L] [-P] [path...] [expression]
其中:其中,'-H' '-L' '-P'三个选项主要是用来处理符号连接,'-H'表示只跟随命令行中指定的符号连接,'-L'表示跟随所有的符号连接,'-P'是默认的选项,表示不跟随符号连接。
path : find命令所查找的目录路径。例如 /home 在根目录下的home目录里面进行查找。
expression :可以分为[option] [action]
option: 用来指定find命令的常用选项,比如-name,-type,-perm等
action: 用来指定find命令后续可执行的一些动作,比如-print,-exec,-ok等
find命令的常用选项详解
常用选项根据使用目的可分为3部分分别是:时间相关的选项,用户或用户组名称相关的选项,文件权限以及名称相关的选项
时间相关选项
查看帮助文档可以看到如下信息
这类参数选项有 -atime,-ctime,-mtime,-amin, -cmin, -mmin等这些时间选项用法基本相似。而(-*time与-*min区别在于前者以24小时作为单位,后者以分钟作为单位)我们以-mtime为例做以介绍
-mtime作用和用法详细介绍
-mtime n: n代表数字,意思是列出在n天之前的“一天之内”被修改过的文件名。
-mtime +n: “+n”代表列出n天之前(不含第n天本身)被修改过的文件名。
-mtime -n: “-n" 代表列出在n天之内(含n天本身)被修改过的文件名
-mtime n的使用
例如命令使用 find /home -mtime 1 -exec ls -ld { } \;
这条命令的意思是在根目录下的home目录中查找一天之前的”一天内的“被更改过的文件并将找到的文件输出在终端。后面的-exec ls -ld { } \ 在后面会进行详细介绍
可以看出列出的是昨天(26号)一天内的文件信息。
-mtime +n的使用
例如使用命令 find /home/god -mtime +10 -exec ls -l { } \;
上面命令的意思是列出/目录下home目录中的god目录 符合10天以前修改过的文件名。然后把这些文件详细信息显示出来。
从文件信息可以看出,所列出的文件都是10天以前的文件。
-mtime -n的使用
例如使用命令 find ./cmd/ -mtime -3 -exec ls -l {} \;
意思是在当前目录下的cmd目录中查找3天之内(含3天本身)被更改过的文件的文件名,最后输出显示。27号三天内由26 25 24号,所以如图
可以看到.file文件是12月24创建的。
在使用命令 find ./cmd/ -mtime -2 -exec ls -l {} \;
作为对比如图
可以看出前两天内,24号的文件就找不到了(不属于两天内的范围)
-newer file1 ! file2
查找更改时间比文件file1新但比文件file2旧的文件
用户或用户组名称相关的选项
这类选项参数有-uid,-gid,-user,-group,-nouser,-nogrop等选项,下面对这些选项的使用方法和实例分析做以陈述。
-uid n:
n为数字,这个数字是用户的账号ID,记录在/etc/passwd/中。可以使用id [用户名]查看
例如使用命令
sudo find /home/ -uid 501 -exec ls -l {} \;
由id命令查看 直到uid为500的用户是tom,所以执行find命令后查找出来了tom用户的相关文件。
-gid n:
这个命令与-uid相似,只是查找的是与组用户相关的文件信息,所以在此不做过多的赘述。
-user name:
name是用户账户名,这个选项是通过账户名来查找相关文件。
例如使用命令
sudo find /home/ -user tom -exec ls -l {} \;
可以看出通过用户tom名称找到了与tom相关的文件。
-group name:
这个命令与-user name相似,只是查找的是与组用户相关的文件信息,所以在此不做过多的赘述。
-nouser:
查找无有效属主的文件,即该文件的属主在/etc/passwd中不存在。
-nogroup
查找无有效所属组的文件,即该文件所属的组在/etc/groups中不存在。
-nouser和-ongroup可以很方便查找系统中不正常的文件。
文件权限以及名称相关的选项
这类参数选项主要有-name filename,-size,-perm,-prune, -depth等
下面对这些常用的选项使用方法和实例进行分析。
-name filename:
filename是目标文件名。直接查找要查找的文件。
例如命令:find /home/god/cmd -name hello.i -exec ls -l {} \;
可以看到直接可以找到目标文件hello.i
-size [+-] SIZE:
查找比SIZE还要大[+]或者还要小[-]的文件。SIZE规格有
c: 代表byte
k: 代表1024bytes
例如使用命令:sudo find /home/ -size +50k -exec ls -lh {} \;
意思是查找路径为/home/下大于50k的文件
可以看出文件大小均大于50k
-perm mode:
查找文件权限”刚好等于“mode的文件,举例来说-rwsr-xr-x属性是4755 s是文件特殊权限值。
-perm -mode:
查找文件权限”必须要全部包含mode权限“如-rwxr–r– 被-rwsr-xr-x包含,所以查找前者0744时后者4755也会被列出来。
-perm +mode:
查找文件权限”包含任一mode的权限“如我们要查找-rwxr-xr-x,也就是-perm +755时,属性为-rw——-也会被列出来。
实例分析
例如命令:sudo find / -perm 4755 -exec ls -lh {} \;
可以看到列出了所有文件权限为4755的文件
实例2
命令:sudo find /home/god/cmd -perm -0644 -exec ls -l {} \;
实例3
命令:sudo find /home/god/cmd -perm +0744 -exec ls -l {} \;
-type TYPE:
查找文件类型为TYPE的,类型主要由f(一般文件), b,c(设备文件),d(目录),l(链接文件),s(socket文件),p(FIFO文件)积累文件
如命令:sudo find /bin -type l -exec ls -l {} \;
看以看到查找的都是链接属性的文件。
实例2
命令:sudo find / -type b -exec ls -l {} \;
可以看到列出的全部是设备文件类型的文件名。
-prune:
使用这一选项可以使find命令不在当前指定的目录中查找,如果同时使用-depth选项,那么-prune将被find命令忽略。
-prune常常配合 -o选项,意思是 expr1 -o expr2 里面,假如满足了第一个。我们就忽略第二个
sudo find . -path "./tt" -prune -o -mtime -2 -print
查找修改时间在2天内的文件并打印,但是排除./tt目录
-prune, -print 是 action
-prune 是排除该条件
所以结果是:
满足 -path “./tt” 我们就 -prune 排除
或者满足 -mtime就 -print(当排除./ttt时候不满足,因为没有这个目录。所以就打印出来2天之内的所有文件)
实例如图:
-depth:
在查找文件时,首先查找当前目录中的文件,然后再在其子目录中查找。
find / -name “CON.FILE” -depth –print
它将首先匹配所有的文件然后再进入子目录中查找
find命令的额外动作(action)
这类参数常用的有-print,-exec,-ok等一下对这三个额外动作做以详细说明
-print:
find命令将匹配的文件输出到标准输出
如命令:
$ sudo find .. -mtime +1 -print;
意思是在当前目录的上级目录查找一天前的文件,然后将符合的文件输出到标准输出(终端)
-exec :
find命令对匹配的文件执行该参数所给出的shell命令.相应命令的形式为’command’ { } ;,注意{ }和;之间的空格.
格式如:sudo find /bin -type l -exec ls -l {} \;
分析:这个格式的特殊地方在于”{}“”\;“, { }代表由find找到的内容,find命令找到的内容会被放到{}位置,而-exec一直到”\;“是关键字,代表find额外命令的开始-exec到结束(\;),这中间的就是find命令的额外命令,上述就是”ls -l {}“
(;)在bash环境下有特殊意义所以用反斜杠转义。
find ./ -size 0 -exec rm { } \;
删除文件大小为零的文件 (还可以以这样做:rm -i find ./ -size 0 或 find ./ -size 0 | xargs rm -f &)
为了用ls -l命令列出所匹配到的文件,可以把ls -l命令放在find命令的-exec选项中:find . -type f -exec ls -l { } \;
(这也是我们开始在用的方式在用的)
-ok:
和-exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行。find . -name “*.c” -mtime +5 -ok rm { } ;
在当前目录中查找所有文件名以.c结尾、更改时间在5天前的文件,并删除它们,只不过在删除之前先给出提示
实例如下
命令:
(1)touch empt
(2)find . -size 0 -exec rm {} \;
.
看以看到大小为0的文件被删除了。
实例2
命令:
(1)touch empt
(2)find . -size 0 -ok rm {} \;
.
看以看出”安全“了很多,避免误删。**