1.  find 详细查找文件或者目录

主要选项: -type 文件类型 f=文件 d=目录 c=字符类型 b=块设备类型
-name 文件名
-iname 文件名不区分大小写
已天为单位:
-mtime 修改文件内容 按修改时间查找 +7 7 天以前 7 第 7 天 -7 7 天以内
-atime 根据访问时间查找
-ctime 根据创建时间查找
已分钟为单位:
-amin 根据访问时间查找
-mmin 根据修改时间查找
-cmin 根据创建时间查找
-user 根据用户名查找
-group 根据组用户查找

-uid

-gid

根据用户的 uid 查找文件

根据用户的 gid 查找文件

-size

根据文件的大小来查找文件(默认单位: KB,MB,GB)

1024:什么都不加,小于文件大小-1 或等于

+1024:大于等于文件大小

-1024 小于等于文件大小

-perm

根据权限查找

/644: 任何一类用户( u,g,o)的权限中的任何一位( r,w,x)符合条件即满足

-644: 每一类用户( u,g,o)权限中的每一位( r,w,x)同时符合条件即满足

!取反

-o 或者

644:什么都不加,精确文件权限匹配

-exec COMMAND {} \; 对查找到的每个文件执行由 COMMAND 表示的命令
注意: find 传递查找到的文件路径至后面的命令时,是先查找出所有符合条件的文件路径,并一次
性传递给后面的命令。但是有些命令不能接受过长的参数,此时命令执行会失败。所以需要另一种
方式来规避问题: find |xargs COMMAND
 

主要案例: find jingfeng/ -type f -name "*.txt" | xargs rm -f
find jingfeng/ -type f -name "jingfeng.txt" -exec rm {} \;
find jingfeng/ -type f -name "*txt" -mtime -7 | xargs rm -f
这条命令解析:查找 jingfeng 目录下的为文件、名字为*txt、最近 7 天之内修改的文件通过管道命
令,再通过 xargs 排序 删除文件
find /jingfeng -type f -name "*.txt" | xargs sed -i s#jingfeng#momo#
或者 sed -i "s#shei#jingfeng#g" $(find /jf/ -type f -name "*.txt")
再或者 find /jf/ -type f -name "*.txt" -exec sed -i "s#shei#jingfeng#g" {} \;
find /jingfeng -type f -name "*.txt" -ok rm -f {} \;这种方式,当你删除的时候,会询问你是
否需要删除该文件
find /backup -type f \( -name "*.log" -o -name "*.tar.gz" \) 同时查找多个名字的文件
find /data -type f -name “.txt” -mtime +7|xargs -i mv {} /tmp
 

下面是具体例子

 

[root@localhost myisam_test]# find /etc -name init

/etc/sysconfig/init

使用name的时候尽量不要在根目录下面查找,尽量缩小查找范围。在根目录下面查找就相当于在整个硬盘上面查找,这样查找的速度会很慢,同时会占用大量的系统资源。在很多服务器上面禁止在根目录下面查找,因为会占用庞大的系统开销。建议在查找的时候尽量缩小查找范围,越小越好。

在linux下面-name后面的名字只会在路径下面搜索名字为该名字的文件,不会搜索文件名字里面包含该名字的文件。

如果只记得文件名字的一部分就要使用通配符,*可以匹配任意字符包括0个。如查找以a开头的文件就a*。如果是查找包含a字母的文件就使用*a*。

[root@localhost myisam_test]# find /etc -name init*   查找以init开头的文件

/etc/sysconfig/network-scripts/init.ipv6-global

/etc/sysconfig/init

/etc/selinux/targeted/active/modules/100/init

 

匹配单个字符就使用?

记住如果确定是t开头后面三个字符,就这样写t???,使用?是精确的匹配,不要使用t*。虽然可以得到相同的结果但是占用的系统资源是不一样的。应该以最快的速度查找到。

[root@localhost myisam_test]# find /etc -name init??

/etc/init.d

/etc/rc.d/init.d

[ ]:同样代表『一定有一个在括号内』的字符(非任意字符)。例如 [abcd] 代表『一定有一个字符, 可能是 a, b, c, d 这四个任何一个』 

  [ - ]  若有减号在中括号内时,代表『在编码顺序内的所有字符』。例如 [0-9] 代表 0 到 9 之间的所有数字

   [^ ]  若中括号内第一个字符为符号 (^) ,那表示『反向选择』,例如 [^abc] 代表 一定有一个字符,要是非 a, b, c 的其他字符就行。

find / -name  [ad]*代表的是查找a开头的文件或者b开头的文件

 

通过文件的大小查找

-size文件大小 单位是block数据块  一个数据块大小512字节=0.5kb

假设要查找大于100M的文件,那么要将100M用数据块来表示。

100MB=102400KB=204800block

大于用+号  小于用-号 等于就什么都不写(这个一般不使用,因为查找文件大小不可能那么精确)

[root@localhost myisam_test]# find / -size +204800

/proc/kcore

/sys/devices/pci0000:00/0000:00:0f.0/resource1_wc

/sys/devices/pci0000:00/0000:00:0f.0/resource1

/usr/lib/locale/locale-archive

 

通过文件所有者查找

-usr 用户名称

现在在系统里面一个用户被删除了,用户删除了但是该用户创建的文件都还在,要将这些文件清理就需要使用-usr选项查看有哪些文件属于这个这个用户并且显示绝对路径。

$find /home -user samlee

可以查找到在/home下面所有者为samlee的文件。

 

 通过时间查看被修改的文件

(1)天 ctime,atime,mtime

(2)分钟 cmin,amin,mmin

-之内,+超过

c-change改变(表示文件属性被修改过,比如文件所有者,所属组,权限这些改变过,即ls-l里面的七个部分)  a-access访问  m-modify修改(文件的内容被修改过)   

[root@localhost myisam_test]# find /etc -mmin -120

/etc

/etc/resolv.conf

Access是该文件被浏览过访问过。查找etc目录下面在两个小时之内被修改过的文件。c是文件的属性被修改过。

 

find连接符

1 连接符-a是and的意思,可以理解为逻辑与,-o是or的意思,可以理解为逻辑或。再长的命令都是由-a  -exec连接起来

-a代表两个条件都得满

在/etc下面查找大于80M小于100M的文件

[root@localhost test]#find /etc -size +163840 -a -size -204800

 

查看etc目录下面名字是以init开头的而且类型是文件

[root@localhost test]# find /etc -name init* -a -type d

/etc/selinux/targeted/active/modules/100/init

/etc/rc.d/init.d

-type 文件类型 f二进制文件  l 软链接文件 d目录

 

查看文件etc目录下文件名字是inittab或者文件大小是大于1000m文件

[root@localhost test]# find /etc -name inittab  -o -size +2048000

/etc/inittab

(2)-exec链接执行符,在用命令查找到一个结果以后,可以直接对其进行一个处理,

格式find .........-exec 命令{} \;

                      {}find的查询结果, 前面find的查询结果可能不只是一条结果,可能是好多条结果,命令要对结果集逐条处理的时候,那么需要花括号做一个集合。然后依次对花括号里面的每条结果进行操作。

                      \转义符,就是使得命令和符号使用其本身的含义

[root@localhost test]# which rm

alias rm='rm -i'

/usr/bin/rm

[root@localhost test]# rm /testfile

rm: remove regular empty file ‘/testfile’? n

[root@localhost test]# \rm /testfile

在用rm删除这个文件时候会有提示功能,因为别名机制,实际上执行的是rm-i,-i这个选项就会在删除文件之前会出现系统询问功能。但是这个是没有必要的,要想系统不出现询问加上转义符\。\就是可以让一个符号或者命令使用它本身的含义。

;表示这个语句的结束。

 

寻找文件名为inittab的文件,并且显示其详细信息

[root@localhost test]# find /etc -name inittab -exec ls -l {} \;

-rw-r--r--. 1 root root 511 Nov  6  2016 /etc/inittab

 

查找的文件并且执行删除

[root@localhost test]# touch /test/mytest

[root@localhost test]# find /test -name mytest -a -type f -exec rm {} \;

[root@localhost test]# ls /test

Sammle离职了,现在删除sammle的所有文件

[root@localhost test]# find /home -user sammle -exec rm-rf {} \;

rm -rf r代表删除目录 f 不代表询问

 

[root@localhost test]# find /etc -name inittab -ok rm {} \;

< rm ... /etc/inittab > ? n

ok选项和exec一样,只不过有一个询问的过程。

查找到samlee这个用户的文件并且删除该文件。

 

很多时候有些人创建的文件特别独特如 a b 删除这样的文件会出现错误,rm a b系统会认为要删除文件a和b。如果在系统里面碰到这种文件如何删除就要使用i节点了。不管文件名字怎么样都可以通过i节点找到。find .表示在当前目录下查找  .代表当前目录。不管有多特殊的文件,都可以使用find和i节点定位到该文件,对这个文件使用exec进行删除操作。

linux下有一些文件比较特别,无法直接删除或者容易误删除成其他文件。删除这类文件时,可以不通过文件名,可以通过inode号进行删除。例如,这里有一个文件名为“-” ,可以通过以下步骤进行删除。
[root@361way ~]# ll
总用量 6856
-rw-r--r-- 1 root root 1040 10月 30 2013 –
使用ls -i 或ls -li查看文件的inode号
[root@361way ~]# ls -il
总用量 6860
271761664 -rw-r--r-- 1 root root 1040 10月 30 2011 –
使用find接inode号查找到文件或再进行删除
[root@361way ~]# find . -inum 271761664 -exec rm -i {} \;
rm:是否删除普通文件 "./–"?y
为避免删错文件,这里使用了rm的交互式删除。不需要交互时,可以将rm后的-i 去掉,也可以直接使用delete进行删除:
# find . -inum 271761664 -delete