关于查找

文件查找:
    locate非实时查找:根据索引查找
    find实时查找:根据文件的各种属性去找到相对应文件
    根据文件的各种属性去找到相对应文件
文本搜索:
    grep, egrep, fgrep

find的用法

find [option]... [查找路径] [查找条件] [处理动作]

查找条件
文件名类
-name "文件名称":支持使用globbing字符
*: 
?:
[]:
[^]:
-iname "文件名称":查找时忽略字符大小写
用户和组类
-user USERNAME
-group GRPNAME1234
-uid UID
-gid GID
-nouser: 查找没有属主的文件
-nogroup: 查找没有属组的文件
文件类型、大小和时间
-type TYPE: 根据文件类型查找
f: 普通文件
d: 目录文件
l: 符号链接
b: 块设备
c: 字符设备
s: 套接字文件
p: 命名管道

-size [+|-]#UNIT
常用单位: k, M, G
#UNIT: #-1 < x <= #
-#UNIT: x <= #-1
+#UNIT: x > #
三者组合起来就是完整的区间

根据时间戳查找:
以“天”为单位
-atime [+|-]#
+#:x >= #+1
-#:x < #
#: # <= x < #+1 
-mtime
-ctime

以“分钟”为单位 
-amin
-mmin
-cmin
根据权限查找:
-perm [+|-]MODE
MODE: 与MODE精确匹配
find ./ -perm 644
+MODE: 任何一类用户的权限只要能包含对其指定的任何一位权限即可;以属主为例,
find ./ -perm +222
-MODE:每类用户指定的检查权限都匹配:
为三类用户所有指定的检查权限都能够被包含
find ./ -perm -222
组合条件查找:
与:-a, 同时满足
或:-o, 满足一个即可
非:-not, !,条件取反

-not A -a -not B = -not (A -o B)
-not A -o -not B = -not (A -a B)
把not抽取出来,里面的符号翻转即可
例子:-not \( -iname "*r* -o -user gentoo \)

处理动作
-print: 默认处理动作,显示
-ls:类似于ls -l  在组合条件中使用容易出问题,会显示靠近-ls到-o的那部分内容,需要用括号括起来解决
-exec COMMAND {} \; #对查找到的文件执行命令,例如将其他用户有执行的权限去掉
-ok COMMAND {} \;

find: 一次性查找符合条件的所有文件,并一同传递给给-exec或-ok后面指定的命令;但,有些命令不能接受过长的参数;此时使用另一种方式
find | xargs -n $num COMMAND #num表示将一次查找的多少个文件传递给COMMAND处理

用法举例

#按文件名查找,使用bash的通配符
find /etc -name "p*"   
find /etc -name "p*[0-9]*"
find /etc -iname "p*"        #忽略文件名大小写

#按文件的属主和属组找
find  /home -user fedora -ls         #-user
find  /home -group fedora -ls         #-group
find /home -uid 5056 -gid 5056 -ls    #按uid或gid找没有属主和属组的文件
find /home -nouser  -ls              #-nouser
find /home -nogroup  -ls             #-nogroup

#组合查询条件
find ./ -name "*s*" -user gentoo -ls
find ./ -name "*s*" -a ! -user gentoo -ls

#摩根定律在组合条件中的使用,转换写法
find ./ ! -iname "*r*" -a ! -user gentoo
find ./ ! \( -iname "*r*" -o -user gentoo \) 

#按大小查找
find /var/log/ -size 5k  #一个单位内都算精确值,例如2是按1k< # <=2k
ls -hl /var/log/secure-20150809
ls -dlh 'find /var/log/ -size 2k'   # 等于2k也就是大于1k并小于2K
ls -dlh -S 'find /var/log/ -size -2k' #小于2k也就是小于1K
ls -dlh -S 'find /var/log/ -size +2k' #大于2k正
ls -dlh -S 'find /var/log/ -size +2k'

#按时间查找
date
Wed Sep  2 11:47:00 HKT 2015
touch -a -t 201508260900 fstab 
stat fstab 
  File: 'fstab'
  Size: 781       Blocks: 8          IO Block: 4096   regular file
Device: fd00h/64768d Inode: 153333      Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2015-08-26 09:00:00.000000000 +0800
Modify: 2015-09-02 10:42:55.812961336 +0800
Change: 2015-09-02 11:44:37.644899036 +0800
find . -atime +7 #找7天前的文件,实际找的是8天前的

#按权限查找
find . -perm 222   #权限精确匹配
find . -perm +222  #任意一用户有写权限即可,这里只有owner有w权限
find . -perm +111  #任意一用户有执行权限即可
find . -perm +111 -type f  #找所有用户有执行权限的文件
find . -perm +001 -type f  #找其他用户有执行权限的文件,这里很有用
find . -perm -644  #每类用户至少包含对应权限模型指定位的权限
find . -perm -222  #找每类用户有写权限的
find . -perm -002  #找其他用户有写权限的

#查找后执行的动作
find ./ -perm -002 -exec chmod -w {} \;
find ./ -perm -002 -exec chmod o-w {} \; #删除其他用户执行权限
find ./ -perm -002 -exec chmod a-w {} \;
find . -perm +200 -a -type f -exec ls -l {} \;
find . -perm +200 -a -type f -a ! -name "*.*" -exec ls -l {} \;
find . -perm +200 -a -type f -a ! -name "*.*" -exec mv {} {}.txt \;  #将属主有写权限且文件名没有后续名的文件增加后续名


练习

1、查找/var/目录属主为root且属组为mail的所有文件;
# find /var -user root -a -group mail

2、查找/usr目录下不属于root、bin或hadoop的所用文件;
find /usr -not -user root -a -not -user bin -a -not -user hadoop
find /usr -not \(-user root -o -user bin -o -user hadoop\)

3、查找/etc/目录下最近一周内其内容修改过的,且不属于root且不属于hadoop的文件;
find /etc -mtime -7 -a -not \(-user root -o -user hadoop\)

4、查找当前系统上没有属主或属组,且最近1个月内曾被访问过的文件;
find / \(-nouser -o -nogroup\) -a -atime -30

5、查找/etc/目录下大于1M且类型为普通文件的所有文件;
find /etc -size +1M -type f

6、查找/etc/目录所有用户都没有写权限的文件;
find /etc/ -not -perm +222

7、查找/etc/目录下至少有一类用户没有写权限;
find /etc/ -not -perm -222

8、查找/etc/init.d/目录下,所有用户都有执行权限且其它用户有写权限的文件;
find /etc/init.d/ -perm -113 


find与xargs

在使用find命令的-exec选项处理匹配到的文件时, find命令将所有匹配到的文件一起传递给exec执行。但有些系统对能够传递给exec的命令长度有限制,这样在find命令运行几分钟之后,就会出现 溢出错误。错误信息通常是“参数列太长”或“参数列溢出”。这就是xargs命令的用处所在,特别是与find命令一起使用。
find命令把匹配到的文件传递给xargs命令,而xargs命令每次只获取一部分文件而不是全部,不像-exec选项那样。这样它可以先处理最先获取的一部分文件,然后是下一批,并如此继续下去。
在有些系统中,使用-exec选项会为处理每一个匹配到的文件而发起一个相应的进程,并非将匹配到的文件全部作为参数一次执行;这样在有些情况下就会出现进程过多,系统性能下降的问题,因而效率不高;
而使用xargs命令则只有一个进程。另外,在使用xargs命令时,究竟是一次获取所有的参数,还是分批取得参数,以及每一次获取参数的数目都会根据该命令的选项及系统内核中相应的可调参数来确定。

find命令用法的更多相关文章

  1. systemctl命令用法详解

    systemctl命令用法详解系统环境:Fedora 16binpath:/bin/systemctlpackage:systemd-units systemctl enable httpd.serv ...

  2. cpio命令用法

    [转自]流浪妖精のSKY    http://www.cnitblog.com/flutist1225/articles/18974.html cpio命令用法 cpio命令     利用cpio 可 ...

  3. shutdown命令用法

    首先我们先创建一个txt文件,添加shutdown -r -f -t 0 ,文件点击另存为,选择所有类型,保存格式为“重启.bat”文件. 说明:shutdown命令用法: /r         关闭 ...

  4. linux中comm命令用法

    linux系统中comm命令用法详解 linux系统下的comm命令是一个非常实用的文件对比命令. comm命令功能:   选择或拒绝两个已排序的文件的公共的行. comm命令语法:comm [-12 ...

  5. Ubuntu kill命令用法详解

    转自:Ubuntu kill命令用法详解 1. kill   作用:根据进程号杀死进程   用法: kill [信号代码] 进程ID   root@fcola:/# ps -ef | grep sen ...

  6. install 命令用法详解

    install 命令用法详解 http://man.linuxde.net/install install命令的作用是安装或升级软件或备份数据,它的使用权限是所有用户.install命令和cp命令类似 ...

  7. which、whereis、locate、find 命令用法

    which.whereis.locate.find 命令用法   大部分转自http://312788172.iteye.com/blog/730280,有修改 我们经常在linux要查找某个文件,但 ...

  8. sed命令用法详解

    sed命令用法 sed是一种流编辑器,它是文本处理中非常有用的工具,能够完美的配合正则表达式使用,功能不同凡响.处理时,把当前处理的行存储在临时缓冲区中,称为『模式空间』(pattern space) ...

  9. linux的strace命令用法

    strace命令用法 调用:strace [ -dffhiqrtttTvxx ] [ -acolumn ] [ -eexpr ] …[ -ofile ] [ -ppid ] … [ -sstrsize ...

  10. linux mail命令用法

    在Linux系统下mail命令的测试 1. 最简单的一个例子: mail -s test admin@aispider.com 这条命令的结果是发一封标题为test的空信给后面的邮箱,如果你有mta并 ...

随机推荐

  1. LeetCode OJ--Construct Binary Tree from Preorder and Inorder Traversal *

    http://oj.leetcode.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/ 根据二叉树的前序遍 ...

  2. T2821 天使之城 codevs

    http://codevs.cn/problem/2821/ 题目描述 Description 天使城有一个火车站,每辆火车都从A方向驶入车站,再从B方向驶出车站. 为了调度火车,火车站设有停放轨道, ...

  3. 访问权限修饰符Protected专题

    上图描述:A类在a包下,m()方法被protected修饰 上图描述:B类也在a包下,B类是A类的子类. 解析:B类和A类是同包类,B类是A类的子类,因此b对象可以调用m()方法. 上图描述:C类也在 ...

  4. 布斯(Steve Jobs)在斯坦福大学的演讲稿,中英文对照版

    2005年6月14日,苹果CEO史蒂夫·乔布斯(Steve Jobs)在他的母校斯坦福大学的毕业典礼发表了著名的演讲,关于这段演讲,你会看到N多人的推荐(比如同样喜欢在大学演讲的李开复先生).此前曾经 ...

  5. Ubuntu 16.04下使用Wine安装正则表达式工具RegexBuddy 4

    说明: 1.使用的Wine版本是深度出品(Deepin),已经精简了很多没用的配置,使启动能非常快,占用资源小. 2.关于没有.wine文件夹的解决方法:在命令行上运行winecfg: 下载: (链接 ...

  6. 用Redis存储Tomcat集群的Session(转载)

    本文转自http://blog.csdn.net/chszs/article/details/42610365 感谢作者 前段时间,我花了不少时间来寻求一种方法,把新开发的代码推送到到生产系统中部署, ...

  7. Linux文件内容查阅

    直接查阅一个文件的内容:cat/tac/nl命令 cat (concatenate) # cat [-AbEnTv] 选项与參数: -A  :相当於 -vET 的整合选项.可列出一些特殊字符而不是空白 ...

  8. 编写自己的UDTF

    1. UDTF介绍 UDTF(User-Defined Table-Generating Functions) 用来解决 输入一行输出多行(On-to-many maping) 的需求. 2. 编写自 ...

  9. python(7)- 小程序练习:循环语句for,while实现99乘法表

    打印99乘法表 for 循环语句实现: for i in range(1,10): for j in range(1,10): print(j,"x",i,"=" ...

  10. python(9)- python基础知识刷题

    1.  执行 Python 脚本的两种方式 交互方式:命令行 Windows操作系统下,快捷键cmd,输入“python”启动交互式python解释器. 文件方式:python文件 2.  简述位.字 ...