wocaosinima 发表于 2018-5-21 09:49:58

linux 文件查找

  文本查找:grep egrep fgrep

  

  文件查找:locate、find
  

  locate和find的区别
  locate有自维护的数据库(linux自建,与所有文件关联),每天linux会定时对其进行更新,而locate就在此数据库中查找,所以查询速度非常快,但是缺点也很明显,不能实时查找(比如刚装linux时这条命令是不能用的),支持的查找方式少。

  find的优点和缺点与locate相对应,find 遍历指定的路径,用以查找文件,所以当指定路径下的文件数量越多,find的查找效率越低,但是find 支持查找的格式非常多,比如根据文件名查找,元属性状态查找,还支持正则等等。

  

  locate:
  非实时,模糊匹配,查找是根据全系统文件数据库进行的;

  速度快

  #updatedb,手动生成文件数据库
  

  find:
  实时

  精确

  支持众多查找标准

  遍历指定路径中的所有文件进行查找,速度慢

  

  find查找路径 查找标准查找到以后的操作
  查找路径:默认为当前路径
  查找(匹配)标准:默认为指定路径下的所有文件
  处理操作:默认为显示
  

  匹配标准:
  -name ‘filename’:对文件名进行精确匹配

  文件名通配:

  *:任意长度的任意字符

  ?:单个长度的任意字符

  []:

  ...

  -iname’filename‘匹配时忽略大小写
  

  -regex pattern:基于正则表达式对文件进行匹配

  pattern必须用绝对路径包含

  

  -userusername:根据属主查找

  -group groupname:根据属组查找

  

  -uidUID:根据uid查找

  -gidGID:根据gid查找

  

  -nouser:查找没有属主的文件

  -nogroup:查找没有属组的文件

  

  -type:
  p:普通文件
  s:socket文件
  d:目录文件
  p:管道文件
  l:链接文件
  ...
  

  -size

  [+|-]#k:查找[大于|小于]#k的文件

  [+|-]#M:查找[大于|小于]#M的文件   

  [+|-]#G:查找[大于|小于]#G的文件
  注意:find 命令里面查找文件大小并不是精确的,它会把大于上一个数到小于下一个数之间的数当成当前数,比如我们查找等于10k的文件,那么9.2k、9.31k、10.1k等等都会被当成10k而被匹配到,而9k 11.1k等就不会

  

  组合条件:

  -a:与

  -o:或

  -not:非

  

  -mtime:根据修改(modify)时间

  -atime:访问(access)时间

  -ctime:改变(change)时间

  [+|-]#:+代表某个时间之前,-代表之后,time默认是天

  (atime和ctime区别:atime修改数据,ctime修改元属性)

  

  -mmin:

  -cmin:

  -amin:
  [+|-]#:

  与time对应,min代表分钟

  

  -perm MODE:完全匹配mode,比如755必须完全匹配755

  /MODE:部分匹配mode,只要一个匹配就可以了,比如r--rw----,只要这三个位置中其他一个被匹配到就可以了,比如可以匹配的有:r--------、rw-------等等

  -MODE:完全包含匹配,匹配的mode必须等于或者可以包含MODE,比如r--rw----,那么r--rwx---、rw-rw----等可以匹配,而---rwxrwx、rwxr-xrwx等不可以匹配

  

  find 利用正则匹配示例:
  # find/etc/-regex "\<pas.*"
  # find/etc/-regex "/etc/\<pas.*"
  /etc/passwd
  /etc/passwd-
  

  处理操作:
  -print:显示

  -ls:类似ls -l的格式显示匹配到的文件的详细信息

  -ok COMMAND {} \;每一次操作都需要用户确认

  -exec COMMAND {} \;

  {}代表匹配到的文件,\;是固定结束符

  

  xargs与find -exec示例
  # find/tmp/ -size -1M   -exec echo {} >>tmp.txt\;
  # cat tmp.txt
  /tmp/mysql.sock
  /tmp/sess_e538a6cd81b0fed9d5c49f1b2f84dd80
  /tmp/sess_c1f3bd3446ca4407d9a2a05bb4897030
  # find/tmp/ -size -1M|xargs echo {} >>tmp1.txt ;
  # cat tmp.txt
  /tmp/mysql.sock
  /tmp/sess_e538a6cd81b0fed9d5c49f1b2f84dd80
  /tmp/sess_c1f3bd3446ca4407d9a2a05bb4897030
  #
  

  示例:

  1、查找/var下属主为root并且属组为mail的所有文件
  find /var/-user root-group mail
  

  2、查找/usr不属于root、bin或student的文件
  find/usr/ -not -user root -o -not -user bin -o -not-user student
  find/usr/ -not \(-user root -o-user bin -o -user student \)

  

  3、查找/etc下最近一周内内容修改过且不属于root以及student用户的文件
  find /etc/ -mtime -7-not -user root -a-not-user student   

  find /etc/ -mtime -7 -not \(-user root -o -user student\)   

  

  4、查找当前系统上没有属组或属主且最近1天内曾被访问过的文件、并将其属主属组修改为root
  find/-nouser -o-nogroup -a -ctime -1 -exec chownroot:root {} \;
  

  5、查找/etc/下大于1M的文件,并写入到/tmp/1.txt中
  find/etc/-size +1M-exec echo {} >>/tmp/1.txt \;
  

  6、查找/etc/所有用户都没有写权限的文件,并显示其详细信息
  find/etc/ -not -perm /222 -ls
  注意这里是用/222而不是-222
页: [1]
查看完整版本: linux 文件查找