1、 locate命令
locate是通过系统事先构建的索引去查找文件,查找速度很快,但并不一定准确,属于非实时查找工具
#手动更新索引
updatedb
注意:
-
索引的构建是系统在空闲时自动进行的(周期计划任务),生产环境,不建议手动更新索引,很消耗资源
#在索引中查找带passwd关键字的位置
locate passwd
#-i 表示不区分大小写
locate -i file1
2、 find命令
find命令属于实时查找工具,通过遍历指定路径下的文件系统完成文件查找。相比较而言,速度略慢,但很精确。不依赖数据库。
语法:
find [OPTION]... [路径] [条件] [处理动作]
路径:指定具体路径,默认为当前路径
条件:可是文件名,大小,类型,权限等,默认查找指定路径下的所有文件
处理动作:对查找的文件做什么操作,默认输出屏幕
2.1、 与时间有关的选项
以天为单位
#在n天之前的“一天内”被更改过的文件;
-mtime n
#列出在n天之前(不含n天本身)被更改过的文件名;
-mtime +n
#列出在n天之内(含n天本身)被更改过的文件名;
-mtime -n
#列出比file还要新的文件名
-newer file
以分钟为单位
-amin
-mmin
-cmin
例:
#在当前目录下查找今天之内有改动的文件
find /root -mtime 0
2.2、 与用户或用户组名有关的选项
#列出文件所有者为name的文件
-user name
#列出文件所属用户组为name的文件
-group name
#查找没有属主的文件,比如:删除一个用户,它之前所创建的文件,拥有者就变成了这个用户的UID,组变成GID,这种文件我们要小心,删除或更改属主属组,否则后面创建一个UID相同的用户,默认就对这个文件拥有了权限。
-nouse
#查找没有组的文件
-nogroup
#列出文件所有者为用户ID为n的文件
-uid n
#列出文件所属用户组为用户组ID为n的文件
-gid n
例:
#在目录/home/ljianhui中找出所有者为ljianhui的文件
find /home/ljianhui -user ljianhui
2.3、 与文件权限及名称有关的选项
#找出文件名为filename的文件
-name filename
#不区分文件名的大小写
-iname filename
#找出比SIZE还要大(+)或小(-)的文件
-size [+-]SIZE
#查找文件的类型为TYPE的文件,TYPE的值主要有:一般文件(f)、设备文件(b、c)、目录(d)、连接文件(l)、socket(s)、FIFO管道文件(p);
-tpye TYPE
#查找文件权限刚好等于mode的文件,mode用数字表示,如0755;
-perm mode
#查找文件权限必须要全部包括mode权限的文件,mode用数字表示
-perm -mode
#查找每一类对象都必须同时拥有为指定的权限的文件,mode用数字表示
-perm +mode
例如:
# 查找文件名为passwd的文件
find / -name passwd -ls
-ls,将文件的属性也列出来
#查找当前目录中文件权限的0755的文件
find . -perm 0755
#查找2k-3k之间的文件
find /var -size 3k
#查找当前目录中大于12KB的文件,
#注意:实际查出的为:13k以上的文件,不包含12-13k内的文件
find . -size +12k
2.4、 组合条件
-a #与
-o #或
-not #非
! #非
注意:
使用组合条件,需要用()括起来
#在/tmp目录下,查找没有属主或没有属组的文件
find /tmp \( -nouser -o -nogroup\ )
#查找属主不是root的文件
find /tmp -not -user root
2.5、 处理动作
#默认动作,显示到屏幕
#类型对查找的文件执行‘ls -l’
-ls
#删除查找到的文件
-delete
#对查找到的每个文件执行COMMAND命令
-ok COMMAND {} \;
-
有些命令,会交互式要求用户确认
-
{},表示引用前面find命令找到的文件名称自身
-
\; 命令固定格式
#对查找到的每个文件执行COMMAND命令
#不交互
-exec COMMAND {} \;
例:
#从根开始查找passwd文件,并拷贝到/root目录下
find / -name passwd -exec cp {} /root \;
注意:
find传递查找到的文件至后面的命令时,将查找到的所有文件一次性传递给后面的命令。而有些命令不能接受过多参数,命令可能会执行失败,所以需要用另一种方式
3、 xargs
-
xargs命令将收到输入参数,以空格作为分隔符,拆分成多个参数,然后传递给后续的命令,作为后续命令的参数
-
默认也是将所有参数一次性传递给后续命令
注意:
xargs和管道的区别
管道,是将前一个命令的输出,作为一个整体传递给后一个命令
#是没办法将ls命令输出的文件删除的
ls |rm -rf
#xargs就可实现
ls |xargs rm -rf
ls | xargs -tn 1 rm -rf
-t,先打印再执行
-n,指定一次传递多少个参数给后续命令
ls | xargs -t -I {} mv {} {}.old
-I,将xargs接收的选项,一行一行的赋值给{}