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、 处理动作

#默认动作,显示到屏幕

-print

#类型对查找的文件执行‘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接收的选项,一行一行的赋值给{}