通配符: 是shell在做匹配的时候会用到,一般用于匹配文件名
    它是由shell进行解析的,比如 find ls cp 等等命令都可以配合着通配符一起使用

    shell常见的通配符
    * : 匹配0或者多个字符
    ?: 匹配任意1个字符
    [list]: 匹配list中任意单个字符
    [c1-c2]: 匹配c1-c2中任意单个字符
    [^c1-c2]: 不匹配c1-c2中任意单个字符
    {string1,string2….} : 匹配{}中任意单个字符

    匹配条件:

    1. *
    2. ?.txt
    3. [123]1.txt —> 11.txt 21.txt 31.txt
    4. [1-9].txt —> 1.txt 2.txt …… 9.txt
    5. [^a-z].txt —> 除了a.txt …. z.txt文件
    6. {A,B,C}.txt —> A.txt B.txt C.txt文件

    shell元字符
    IFS : //
    CR:
    = :设定变量
    $ : 获取变量
    >< : 重定向
    | : 管道
    & : 后台执行命令
    () : 在子shell中执行命令/运算或命令替换等
    {}: 函数中执行/变量替换的范围定界
    ; : 命令结束后,忽略其返回值,继续执行下一个命令
    && : 命令结束后,若为true,继续执行下一个命令
    || : 命令结束后,若为false,继续执行下一个命令
    ! : 非
    # :注释
    \ : 转义

    shell转义符:
    硬转义: 内部所有shell元字符、通配符等 都会被关闭掉 ‘ ‘
    软转义: 内部所有shell元字符、通配符等 都正常生效 “ “

    案例:
    [root@test test1]# a=1
    [root@test test1]# echo ‘$a’
    $a
    [root@test test1]# echo “$a”
    1

    find命令
    实时查找工具,通过遍历指定路径下的文件系统完成文件查找
    工作特点:
    查找速度略慢
    精确查找
    实时查找

    [root@test tmp]# find —help
    Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path…] [expression]

    find [选项] [路径] [查找条件 + 处理动作]

    路径: 指定具体目录路径,默认是当前文件夹
    查找条件: 指定查找的标准(文件名/大小/文件类型/权限等等),默认是找出所有文件
    处理动作: 对符合条件的文件做什么操作,默认是输出屏幕

    • 查找条件

    根据文件名称查找:
    -name “filename” 根据文件名称查找(支持通配符global)
    -iname “filename” 根据文件名称查找;忽略大小写(支持通配符global)
    -regex “PATTERN” 以pattern匹配整个文件路径字符串,而不仅仅是文件名称

    1. [root@test tmp]# find ./ -name "1[123].txt"

    根据属主和属组查找:
    -user username : 查找属主为指定用户的文件
    -group groupname: 查找属组为指定用户的文件find
    -uid UID : 查找属主为指定UID号的文件
    -gid GID :查找数组为指定GID号的文件
    -nouser: 查找没有属主的文件
    -nogroup: 查找没有属组的文件
    ##匹配次数 *:匹配前面的字符任意次数
    .*:匹配任意长度的字符
    \?:匹配其前面字符0或1次,即前面的可有可无
    +:匹配其前面的字符至少1次
    {m}:匹配前面的字符m次
    {m,n}:匹配前面的字符至少m次,至多n次
    {0,n}:匹配前面的字符至多n次
    {m,}:匹配前面的字符至少m次

    根据文件类型查找:
    -type TYPE :
    TYPE: f d l s b c p

    组合条件:
    与:-a
    或:-o
    非: -not

    相关案例:找出/tmp目录下,属主不是root,且文件名不是fstab的文件

    find /tmp ( -not -user root -a -not -name “fstab”\ )

    根据文件大小查找:
    -size [+|-]N[bkMG]

    寻找/下文件大小超过10M的所有文件:
    [root@test tmp]# find / -size +10M

    根据时间戳:
    -mtime [+-]days:-表示days内修改过,+表示days前修改过,不加表示正好在days修改过。
    -ctime [+-]days:改变时间,+-含义同-mtime。
    -atime [+-]days:访问时间,+-含义同-mtime。
    -mmin n:n分钟前修改过文件内容,
    -cmin n:n分钟前文件改变过。
    -amin n:n分钟前文件被访问过。
    天:
    -atime [+|-]N
    -mtime [+|-]N
    -ctime [+|-]N
    -atime +7 : 表示7天内

    
    
    
    分
    
        -amin [+|-]N 
        -mmin [+|-]N 
        -cmin [+|-]N
    

    根据权限进行查找:
    -perm [+|-]MODE
    MODE : 精确查找
    /MODE : 任何一类(u g o )对象的权限中只要能有一位匹配即可
    -MODE : 每一类对象都必须同时拥有为其制定的权限标准

    处理动作:
    -print: 默认处理动作,显示至屏幕上
    -ls: 类似于对查找到的文件执行 ls -l 命令
    -delete: 删除查找到的文件
    -fls /path/to/somefile : 查找到的所有文件的**长格式信息**保存至指定文件中

    -ok COMMAND {}\ : 
        对查找到的每个文件执行由COMMAND指定的命令 
        {}: 用于引用查找到的文件名称自身
        交互式,每个文件执行命令前会让用户确定
    
    -exec COMMAND {}\: 
        对查找到的每个文件执行由COMMAND指定的命令 
        {}: 用于引用查找到的文件名称自身
    


    实例1: 对/tmp目录下所有属主为root用户的文件修find改其属主为zhangsan
    chown [-cfhvR] [—help] [—version] user[:group] file…
    参数 :

    • user : 新的文件拥有者的使用者 ID
    • group : 新的文件拥有者的使用者组(group)
    • -c : 显示更改的部分的信息
    • -f : 忽略错误信息
    • -h :修复符号链接
    • -v : 显示详细的处理信息
    • -R : 处理指定目录以及其子目录下的所有文件
    • —help : 显示辅助说明
    • —version : 显示版本

    [root@test tmp]# find /tmp -user root -ok chown zhangsan: {} \; (这里 {} \ 之间要有空格)

    实例2: 对/tmp目录下所有属主为zhangsan用户或者属主为zhangsan的文件修改其为root:root
    [root@test tmp]# find /tmp -user zhangsan -o -group zhangsan -exec chown root:root {} \;

    注意:find传递查找到的文件至后面指定的命令时,查找到所有符合条件的文件一次性传递给后面的命令;
    另一种 方式可规避此问题 find | xargs COMMAND

    等同于上面实例2的操作
    [root@test tmp]# find /tmp -user zhangsan -o -group zhangsan | xargs chown root:root
    -type TYPE:根据指定的文件类型查找文件
    **f:普通文件
    **d:目录文件
    **l:链接文件
    **p:管道文件
    s:套接字文件
    **b:块设备文件
    c:字符设备文件
    **
    但是有些命令不能接受过长的参数,此时命令执行会失败,另一种方式可规避次问题
    find | xargs COMMAND**
    练习题:

    1. 查找/var目录下属主为root,且属组为mail的所有文件或目录

      find /var/ -type f -user root -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 )

    1. 查找/etc目录下最近一周内容曾被访问过的文件或目录

    find /etc/ -mtime -7 -a -not ( user root -o -user hadooop )

    1. 查找当前系统上没有属主或属组,且近一周内曾被访问过的文件或目录

      find / (-nouser -o -nogroup ) -atime -7

    2. 查找/etc目录下大于1M且类型为普通文件的所有文件或目录

      find /etc -size +1M -type f

    3. 查找/etc目录下所有用户都没有写权限的文件

      find /etc -not -perm /222

    4. 查找/etc目录下至少一类用户没有执行权限的文件(r:4w:2x:1)

      find /etc -not -perm -111 x执行权限 ugo 111:001 101 111
      find -perm -mode , 表示mode中转换成二进制的1在文件权限位里面必须匹配,0则不用管。(也就是说如果一个文件的权限比参数中的mode要多,则是匹配的)
      比如mode=644那么转换成二进制为110 100 100,而被查找的文件的权限位也可以被转换成一个二进制数,两者在位上为1的部分必须完全匹配,而0则不管。例如被查找的文件的权限为转换成二进制数是 111 111 111那么这个比如被匹配,而假如是100 100 100那么则不会匹配。所以这个’-‘的作用归结起来就是匹配比mode权限更充足的文件(找不到什么词语来形容了)

    5. 查找/etc/init.d目录下,所有用户都执行权限,且其它用户写权限的文件

      find /etc/init.d -perm -113

    -perm mode 文件的权限正好是mode就匹配
    -perm -mode 文件的权限包括mode就匹配(该文件还可以拥有额外的权限属性)