【linux_笔记】Linux_文件查找(find)详解&&特殊权限

学习资源来自:www.magedu.com

学习记录过程中难免出现错误,如有发现,还望大神们指出。

示例操作部分有的与历史操作有关,如果先前的示例操作没有执行过的话,可能会有部分示例的操作无法执行。示例仅供参考(练习题在附录)。



文件查找:


locate(不常用):非实时,模糊匹配,根据全系统文件数据库进行查找,速度快;
# updatedb, 手动生成文件数据库(非常耗时)


find:实时,精确,支持众多查找标准,遍历指定目录中的所有文件完成查找,速度慢;


命令格式:find 查找路径 查找标准 查找到以后的处理运作
    查找路径:默认为当前目录
    查找标准:默认为指定路径下的所有文件
    处理运作:默认为显示

匹配标准:


    -name 'FILENAME':对文件名作精确匹配(严格区分大小写)
    -iname 'FILENAME': 文件名匹配时不区分大小写
    -regex PATTERN:基于正则表达式进行文件名匹配    
    -user USERNAME: 根据属主查找
    -group GROUPNAME: 根据属组查找
    文件名通配:
        *:任意长度的任意字符
        ?
        []


        示例:
        find /etc -name 'passwd' ―― 在etc下精确匹配文件名是passwd的文件
        find /etc -name 'passwd*' ―― 匹配文件名以passwd开头的文件
        find /etc -name '*passwd' ―― 匹配文件名以passwd结尾的文件
        find /etc -name '*passwd*' ―― 匹配文件名含有passwd字符串的文件
        
        find /tmp -user hadoop ―― 根据属主查找
        find /tmp -user student

    (用户被删除后,此前该用户创建的文件属主就会修改为该用户的UID)
    -uid UID: 根据UID查找
    -gid GID: 根据GID查找    
    -nouser:查找没有属主的文件
    -nogroup: 查找没有属组的文件
        

    示例:
        su - user1
        cd /tmp
        touch userone
        ls -l
        exit
        ls -l /tmp
        userdel -r user1
        ls -l /tmp ―― userone文件的属主、属组显示为UID、GID
        find /tmp -uid 5001 ―― 我的系统上UID显示的是5001
            /tmp/userone
        find /tmp -nouser
            /tmp/userone
        find /tmp -nogroup
            /tmp/userone
            
    -type (根据文件类型进行查找)
        f: 普通文件
        d:目录
        c:字符
        b:块
        l:链接字
        p:管道
        s:套接字
        

        示例:
        find /tmp -type d ―― 查找tmp下文件类型为目录的文件
        find /tmp -type s ―― 查找tmp下文件类型为套接字的文件
        find /tmp -type s -ls ―― 进行验证(动作部分在下文)
        
    -size [+|-]  ―― 根据文件大小进行查找(不跟单位默认字节)(“+-” 相当于 “大于小于”)
        #k:kb
        #M:mb
        #G:gb

        
        示例:
        find /etc -size 10k -ls (查找etc下大小在9-10k之间的文件)
        find /etc -size -10k -ls (查找所有小于10k的文件)
        
    组合条件查找:
        -a:与
        -o:或
        -not :非

    
        示例:
        1、
        find /tmp -nouser -a -type d -ls ―― 查找tmp目录下没有属主并且类型为目录的文件
        find /tmp -nouser -o -type d ―― 查找没有属主或者类型为目录的文件
        find /tmp -not -type d -ls ―― 查找非目录类型文件
        find /tmp -not \( -type d -o -type s \) -ls―― 查找既不是目录类型也不是套接字类型的文件
        2、
        rm -rf /tmp/test
        cd /tmp
        mkdir /tmp/test
        cd /tmp/test
        touch a b c d
        useradd user1
        useradd user2
        chown user1 a ―― 修改a的属主为user1
        chown user2 b ―― 修改b的属主为user2
    
        find ./ -user user1
       find ./ -user user2
        find ./ -not \( -user user1 -o -user user2 \) ―― 查找属主不是user1,也不是user2的文件
        mkdir hello
        mkdir hi
        chown user1 hi
        ls -l
        find ./ -not \(-user user1 -a -type d\) 属主不是user1或者不是目录的文件――摩根定律

    -mtime #:查找最近一次修改时间距现在#天的文件
    -ctime #:查找最近一次改变时间距现在#天的文件
    -atime #:查找最近一次访问时间距现在#天的文件
        [+|-]#:距离现在[大于|小于]#天
    -mmin #:查找最近一次修改时间距现在#分钟的文件
    -cmin #:查找最近一次改变时间距现在#分钟的文件
    -amin #:查找最近一次访问时间距现在#分钟的文件
        [+|-]#:距离现在[大于|小于]#分钟

        
        示例:(在/tmp/test下)
        find ./ -amin -5 ―― 查找当前目录下最近一次修改时间距现在小于5分钟的文件
        stat hi
        stat hello
        find ./ -amin +5 ―― 查找当前目录下最近一次修改时间距现在大于5分钟的文件
        
    -perm MODE:通过精确匹配文件的权限查找文件
        /MODE: 查找文件权限任意一位与MODE相匹配的文件
        -MODE: 查找文件权限能完全包含此MODE的文件

        例如:
        匹配条件:-644(MODE)
        644: rw-r--r--
        755: rwxr-xr-x ―― MODE不匹配(只有同样是644才匹配),/MODE匹配,

                               ―― -MODE匹配(rwxr-xr-x包含rw-r--r--)
        750: rwxr-x--- MODE不匹配,/MODE匹配,-MODE不匹配
        
        示例:(在/tmp/test下)
        find ./ -perm 644
        chmod 0-r a
        find ./ -perm /644 -ls
        find ./ -perm -644 -ls
        chmod 006 b
        ls -l
        find ./ -perm /640
        find ./ -perm -001  ―― 查找其他用户有执行权限的文件
        
动作:


    -print: 显示(默认)
    -ls:类似ls -l的形式显示每一个文件的详细
    -ok COMMAND {} \; 每一次操作都需要用户确认    ―― {}代表前面已经查找到的文件集
    -exec COMMAND {} \; 对查找到的文件执行指定命令(不需要确认)

    
    示例:(示例中省略部分ls -l,操作中自行添加检验操作结果)
    在当前目录下查找其他用户有wr权限的文件,并撤销其他用户这些文件的w权限:
    find ./ -perm -006 -exec chmod o-w {} \;
    find ./ -type d -ok chmod +x {} \; ―― 对目录文件添加所有用户的x权限
    ls -l
    chmod 666 b
    chmod 664 d
    ls -l
    find ./ -perm -020 -exec mv {} {}.new \;对查找到的文件,在其文件名后面添加.new
    
    cd
    ls -l
    find ./ -name "*.sh" -a -perm -111 -exec chmod o-x {} \; ―― 组合查找+修改权限
    ls -l
   
特殊权限SUID等讲解

SUID: 运行某程序时,相应进程的属主是程序文件自身的属主,而不是启动者;
    chmod u+s FILE
    chmod u-s FILE
        如果FILE本身原来就有执行权限,则SUID显示为s;否则显示S;


SGID: 运行某程序时,相应进程的属组是程序文件自身的属组,而不是启动者所属的基本组;
    chmod g+s FILE
    chmod g-s FILE

Sticky: 在一个公共目录,每个人都可以创建文件,删除自己的文件,但不能删除别人的文件;
    chmod o+t DIR
    chmod o-t DIR
    
    示例:
    1、SUID
    ls -l /bin/cat ―― 查看cat的权限设置
    ls -l /etc/shadow ―― 查看shadow的权限设置
    useradd hadoop
    su - hadoop
    cat /etc/shadow ―― hadoop没有访问权限
    exit
    
    chmod u+s /bin/cat ―― 添加SUID权限给cat
    ls -l /bin/cat
    su - hadoop
    whoami
    cat /etc/shadow ―― 此时cat的属主是管理员而不是hadoop,具有管理员权限
    exit
    
    chmod u-s /bin/cat
    2、
    说明:有一个开发团队(develop team),有三个成员(hadoop,hbase,hive),
    现希望三个成员可以互相访问、使用同一文件,每个人都可以创建文件、
    删除自己的文件,但不能删除别人的文件。
    useradd hbase
    useradd hive
    mkdir /tmp/project ―― 创建项目目录
    groupadd developteam ―― 添加开发团队组
    chown -R :developteam /tmp/project ―― 修改project的属组
    usermod -a -G developteam hadoop ―― 向hadoop追加新的附组developteam
    usermod -a -G developteam hbase
    usermod -a -G developteam hive
    
    su - hadoop
    cd /tmp/project ―― project没有写权限
    ls -ld
    touch a.hadoop ―― 拒绝执行
    exit
    
    chmod g+w /tmp/project ―― 管理员给project添加写权限
    
    su - hadoop
    cd /tmp/project
    touch a.hadoop ―― hadoop在project下创建文件a.hadoop
    exit
    
    su - hbase
    cd /tmp/project
    touch a.hbase ―― hbase在project下创建文件a.hbase
    ls -l ―― a.hadoop、a.hbase的属主属组分别都是是hadoop和hbase
    exit
SGID:
    chmod g+s /tmp/project/ ―― 给project添加SGID权限
    ls -ld /tmp/project/
    su - hadoop
    cd /tmp/project
    touch b.hadoop ―― hadoop在project下创建文件b.hadoop
    exit
    
    su - hbase
    cd /tmp/project
    touch b.hbase ―― hbase在project下创建文件b.hbase
    ls -l ―― 在project中创建的文件属组不再是创建文件的用户基本组而是目录的属组
             ―― b.hadoop、b.hbase的属组都是developteam
    exit
    
    su - hadoop
    rm /tmp/project/b.hbase ―― hadoop可以删除b.hbase
    ls -l /tmp/project/
    exit
Sticky:    
    su - hbase
    cd /tmp/project
    touch b.hbase
    exit

    chmod o+t /tmp/project/ ―― 给project添加Sticky权限
    ls -ld /tmp/project/
    
    rm /tmp/project/b.hbase ―― hadoop不能删除b.hbase
    rm /tmp/project/b.hadoop  ―― 但是可以删除b.hadoop
    
由SUID、SGID、Strcky又组成了一组权限
    000:
    001:
    ...
    110:
    111:
    
    例如:chmod 7755 /backup/test 最前面的权限7代表的是权限sst
    遮罩码的MODE第一位就是特殊权限组
        umask 0022
        umask 0002

你可能感兴趣的:(文件查找,SGID,Sticky))