clsass 10 shell编程(二)及文件查找及压缩

一、选择执行(条件判断if)

流程控制

过程式编程语言:

    顺序执行
    选择执行
    循环执行

使用read 命令来接受输入

使用read 来把输入值分配给一个或多个shell变量:
    -p 指定要显示的提示
    -t TIMEOUT
read 从标准输入中读取值,给每个单词分配一个变量所有剩余单词都被分配给最后一个变量
read -p “Enter a filename: “ FILE

条件选择if 语句

选择执行:

注意:if 语可嵌套

单分支    if  判断条件:then
         条件为真的分支代码    
       fi
双分支    
       if  判断条件; then
         条件为真的分支代码   
       else
         条件为假的分支代码   
       fi

if 语句

多分支    if  CONDITION1 ; then          、
                    if-true    
             elif CONDITION2 ; then           
                    if-ture   
             elif CONDITION3 ; then         
                    if-ture           
                    ...
         else
           all-false
         fi
逐条件进行判断,第一次遇为“真”条件时,执行其分支,而后 结束整个if语句

if实例

根据命令的退出状态来执行命令   
       if ping -c1 -W2 station1 &> /dev/null; then
        echo 'Station1 is UP'
    elif grep "station1" ~/maintenance.txt &> /dev/null
    then
        echo 'Station1 is undergoing maintenance‘    
        else
        echo 'Station1 is unexpectedly DOWN!'        
        exit 1
    fi

条件判断:case 语句 (离散值匹配)

case 用变量引用 in       
PAT1)
    分支1
    ;;
PAT2)
    分支2
    ;;
...
*)
    默认分支
    ;;
esac

case 支持glob 风格的通配符:
    *:  任意长度任意字符
    ?:  任意单个字符
    []:指定范围内的任意单个字符
    a|b: a 或b    
    case $1 in
    start)
    
        ;;
    stop)
    
        ;;
    restart)
    
        ;;
    status)
        ;;
    esac

二、文件查找

文件查找

在文件系统上查找符合条件的文件;
文件查找:locate, find
    非实时查找( 数据库查找) :locate
    实时查找:find

locate

查询系统上预建的文件索引数据库
   /var/lib/mlocate/mlocate.db依赖于事先构建的索引
索引的构建是在系统较为空闲时自动进行( 周期性 任务), 管理员手动更新数据库(updatedb)
索引构建过程需要遍历整个根文件系统,极 消耗资源
工作特点:
    •  查找 速度 快
    •  模糊 查找
    •  非实时查找
    •  搜索的是文件的全路径,不仅仅是文件名
    •  可能只搜索用户具备读取和执行权限的目录

locate 命令

locate KEYWORD
有用的选项
    • -i 执行区分大小写的搜索
    • -n N 只列举前N 个匹配项目
locate foo
    • 搜索名称或路径中带有“foo ”的文件
locate -r ‘\.foo$’
    • 使用Regex 来搜索以“.foo ”结尾的文件    
 ***注意***
 locate  可以指定搜索范围,结果尾模糊搜索
 
   [root@6 ~]# locate  /  .sh
 
     -r  --regexp  为全局搜索,扩展正则表达式较精确查找
   [root@6 ~]# locate    -r   '\.sh$' |wc -l

find

实时查找工具,通过遍历指定路径完成文件查找;
工作特点:
    • 查找速度略慢
    • 精确查找
    • 实时查找
    • 可能只搜索用户具备读取和执行权限的目录



语法:

find [OPTION]... [ 查找路径] [ 查找条件] [ 处理动作]查找路径:指定具体目标路径;默认为当前目录

查找条件:指定的查找标准,可以文件名、大小、类型、权限等标准进行;默认为找出指定路径下的所有文件

处理动作:对符合条件的文件做操作,默认输出至屏幕

查找条件

根据文件名和inode 查找: 
    -name " 文件名称" :支持使用glob 
           *, ?, [], [^]     
           “  ”  需要加引号
    -iname " 文件名称" :不区分字母大小写
    -inum n 按inode 号查找
    -samefile name 相同inode号的文件
    
     [root@6 bin]# find / -samefile /dev -ls
     
    -links n 链接数为n的文件
    
     [root@6 bin]# find / -links 10 

    -regex "PATTERN" :以PATTERN匹配整个文件路径字符串,而不仅仅是文件名称
        [root@6 ~]# find / -regex  '.*.sh$' 
        /tmp/keyring-NSUSmG/socket.ssh
        /tmp/keyring-89q2lx/socket.ssh
        /tmp/keyring-YaRraG/socket.ssh
        /tmp/keyring-IuDmPE/socket.ssh
        /tmp/keyring-ZeIVAk/socket.ssh
        /tmp/keyring-9TFDWv/socket.ssh
        /tmp/keyring-nLuDLL/socket.ssh
        /tmp/keyring-DEtZIt/socket.ssh
        /tmp/keyring-BRIf2d/socket.ssh

查找条件

根据属主、属组查找:
    -user USERNAME :查找属主为指定用户(UID) 的文件    
    -group GRPNAME:  查找属组为指定组(GID) 的文件    
    -uid UserID :查找属主为指定的UID 号的文件    
    -gid GroupID :查找属组为指定的GID 号的文件    
    -nouser :查找没有属主的文件    
    -nogroup :查找没有属组的文件    
     find  /  -nouser  -nogroup    并且


根据文件类型查找:
 -type TYPE:    • f:  普通文件
    • d:  目录文件
    • l:  符号链接文件
    • s :套接字文件
    • b:  块设备文件
    • c:  字符设备文件
    • p:  管道文件


组合条件:
    与:-a
    或:-o
    非:-not, !
      find  !  
 
   
德· 摩根 定律:
    (非 P) 或 (非 Q) =  非(P 且 Q)
    (非 P) 且 (非 Q) =  非(P 或 Q)
示例:

2016-8-16 1.JPG

   !A -a !B = !(A -o B)

2016-8-16 2.JPG

 !A -o !B = !(A -a B)

find 示例

find -name snow.png
  • 搜索名为snow.png 的文件
find -iname snow.png
  • 不分大小写地搜索名为snow.png 、Snow.png、 SNOW.PNG 等的文件
    find / -name “*.txt”
    find /var –name “*log*”
    find -user joe -group joe
    搜索被用户joe  以及组群joe 所拥有的文件


  • find -user joe -not -group joe
  • find -user joe -o -user jane
  • find -not \( -user joe -o -user jane \)
  • find / -user joe -o -uid 500


  找出/tmp 目录下,属主不是root,且文件名不以f 开头的文件
  find /tmp \( -not -user root -a -not -name 'f*' \) -ls
  find /tmp -not \( -user root -o -name 'f*' \) –ls
  
***排除 目录

• 示例:查找/etc/ 下,除/etc/sane.d 目录的其它所有.conf 后缀的文件

    find /etc -path ‘/etc/sane.d’ -a -prune -o -name “*.conf” -print
    [root@6 bin]# find /root -path '/root/bin' -a -prune -o -name "*.sh"  根据文件大小来查找:
    -size [+|-]#UNIT
        常用单位:k, M, G    #UNIT: (#-1, #]
        如:6k  表示(5k,6k]
    -#UNIT :[0,#-1]
        如: :-6k  表示[0,5k]
    +#UNIT :(#, ∞ )
        如: :+6k  表示(6k ,∞)
        
        -10k  [0.9k]       
         10k  (9,10k]
         +10k  (10k,+∞)

根据时间戳:
  以“天”为单位;
    -atime [+|-]#,
        #: [#,#+1)
        +#: [#+1, ∞ ]
        -#: [0,#)
        -mtime
        -ctime
  以“分钟”为单位:
        -amin
        -mmin
        -cmin
        
      -atime  -7 [0,7)
   -atime   7 [7,8)
    -atime  +7 [8,+∞)
    

根据权限查找:
-perm [/|-]MODE
       MODE: 精确权限匹配
      /MODE:任何一类(u,g,o)对象的权限中只要能一位匹配即 可,或关系,+  从centos7 开始淘汰
      -MODE:每一类对象都必须同时拥有指定权限,与关系      0  表示不关注    020  
    •  find -perm 755 会匹配权限模式恰好是755 的文件
    •  只要当任意人有写权限时,find -perm +222 就会匹配
    •  只有当每个人都有写权限时,find -perm -222 才会匹配
    •  只有当其它人(other )有写权限时,find -perm -002才会匹配
    find -perm /002 === find -perm -002
    ***  摩根定律同样适用 
   •  只要当所有人都没有写权限时,find  -not -perm +222 才会匹配
   •  只有当任意人没有写权限时,find -not -perm -222 就会匹配
   •  只有当其它人(other )没有写权限时,find -not -perm -002才会匹配

处理动作

-print :默认的处理动作,显示至屏幕;
-ls :类似于对查找到的文件执行“ls -l” 命令
-delete :删除查找到的文件;
-fls file:查找到的所有文件的长格式信息保存至指定文件中
-ok COMMAND {} \;  对查找到的每个文件执行由find -perm -222 -ok rm {} \;
COMMAND 指定的命令;对于每个文件执行命令之前,都会交互式要求用户确认
-exec COMMAND {} \;  对查找到的每个文件执行由COMMAND 指定的命令

  {}: 用于引用查找到的文件名称自身
 [root@6 bin]# find /testdir/bin -regex '^.*\.sh$' -exec chmod 111 {} \; find传递查找到的文件至后面指定的命令时,查找到所有符合条件的文件一次性传递给后面的命令
 有些命令不能接受过多参数,此时命令执行可能会失败,下面方式可规避此问题  find | xargs COMMAND
  [root@6 bin]# find /testdir/bin -regex '^.*\.sh$'  |xargs  chmod 777

find 示例

find -name “*.conf” -exec cp {} {}.orig \;
 •  备份配置文件,添加.orig 这个扩展名find /tmp -ctime +3 -user joe -ok rm {} \;
 •  提示删除存在时间超过3天以上的joe 的临时文件find ~ -perm -002 -exec chmod o-w {} \;
 •  在你的主目录中寻找可被其它用户写入的文件find / data –type f -perm 644 -name “*.sh” –exec chmod 755 {} \;find /home –type d -ls

Gnome 搜索工具

位置-> 搜索文件……
图形化搜索工具,可搜索
    • 命令
    • 内容
    • 用户/ 组群
    • 大小
    • 修改时间

三、压缩、解压缩及归档工具

file-roller
compress/uncompress: .Zgzip/gunzip: .gzbzip2/bunzip2: .bz2xz/unxz: .xzzip/unzip
tar
cpio

compress/uncompress

compress [-dfvcVr] [-b maxbits] [file ...]
    -d:  解压缩,相当于    -c:  结果输出至标准输出, 不删除原文件    -v:  显示详情uncompress 解压缩
zcat file.Z >file

gzip/gunzip

gzip [OPTION]... FILE ...    -d:  解压缩,相当于gunzip
    -c:  将压缩或解压缩的结果输出至标准输出    -# :1-9 ,指定压缩比,值越大压缩比越大zcat :不显示解压缩的前提下查看文本文件内容
实例:    gzip -c messages >messages.gz
    gzip -c -d messages.gz > messages
    zcat messages.gz > messages

bzip2/bunzip2/bzcat

bzip2 [OPTION]... FILE ...
    -k: keep,  保留原文件
    -d :解压缩
    -# :1-9 ,压缩比,默认为6bzcat :不显式解压缩的前提下查看 文本文件内容

xz/unxz/xzcat

xz [OPTION]... FILE ...
    -k: keep,  保留 原文件
    -d :解压缩
    -# :1-9 ,压缩比,默认为6xzcat:  不显式解压缩的前提下查看 文本文件内容

zip/unzip

打包压缩    zip –r sysconfig sysconfig/
解包解压缩
    unzip sysconfig.zip
    cat /var/log/messages | zip message -
    unzip -p message > message

积累应用

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

 find  /var   -user root -a  -group mail  -ls

[root@6 ~]# find /var -user root -a -group mail  -ls
394580    4 drwxrwxr-x   2 root     mail         4096 8月 16 09:30 /var/spool/mail
393528   16 -rw-------   1 root     mail        13723 8月 16 09:30 /var/spool/mail/root
393317    4 -rw-rw----   1 root     mail         2444 7月 31 22:21 /var/spool/mail/lvasu

2 、查找/var 目录下不属于root 、lp 、gdm 的所有文件

  find  /var   -not  \(  -user root  -o  -user lp  -o -user gdm\)   -ls

[root@6 ~]# find /var -not \( -user root -o -user lp -o -user gdm\) -ls
find: “gdm)” is not the name of a known user
[root@6 ~]# find /var -not \( -user root -o -user lp -o -user gdm \) -ls
402941    4 drwxr-xr-x   2 ntp      ntp          4096 5月 12 04:04 /var/log/ntpstats
400971    0 -rw-r--r--   1 rpcuser  rpcuser         0 5月 11 14:22 /var/lib/nfs/state
659692    4 drwx------   4 rpcuser  rpcuser      4096 7月 20 17:13 /var/lib/nfs/statd
799382    4 drwx------   2 rpcuser  rpcuser      4096 5月 11 14:22 /var/lib/nfs/statd/sm
922887    4 drwx------   2 rpcuser  rpcuser      4096 5月 11 14:22 /var/lib/nfs/statd/sm.bak
1183280    4 drwx------   2 pulse    pulse        4096 2月  3  2016 /var/lib/pulse
1179932    4 drwx------   2 apache   apache       4096 5月 12 03:29 /var/lib/dav
1050630    4 drwxr-xr-x   2 ntp      ntp          4096 5月 12 04:04 /var/lib/ntp

3 、查找/var目录下最近一周内其内容修改过,同时属主不为root ,也不是postfix 的文件

  find  /var  -mtime   -7    -not  \(  -user root  -o -user postfix \)  -ls

[root@6 ~]# find /var -mtime -7 -not \( -user root -o -user postfix \) -ls
1184780    4 drwx--x--x   2 gdm      gdm          4096 8月 16 08:54 /var/run/gdm/auth-for-gdm-BmBwqG
1184791    4 -rw-------   1 gdm      gdm            58 8月 16 08:54 /var/run/gdm/auth-for-gdm-BmBwqG/database
400934    4 dr-x--x--x   2 lp       sys          4096 8月 16 08:54 /var/run/cups/certs
393310    4 -rw-r--r--   1 rpcuser  rpcuser         5 8月 16 08:54 /var/run/rpc.statd.pid
393565    0 -rw-rw----   1 tom      mail            0 8月 15 20:11 /var/spool/mail/tom
393276    4 -rw-------   1 rpc      rpc           164 8月 15 22:15 /var/cache/rpcbind/portmap.xdr
393274    4 -rw-------   1 rpc      rpc           852 8月 15 22:15 /var/cache/rpcbind/rpcbind.xdr

4、查找当前系统上没有属主或属组,且最近一个周内曾被访问过的文件

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

[root@6 ~]# find  / \( -nouser -o -nogroup \) -atime -7   -ls
666130    4 drwx------   2 1001     1001         4096 8月  1 16:55 /home/ha2
666129    4 drwx------   2 1000     1000         4096 8月  1 16:55 /home/ha1
666131    4 drwx------   2 1002     1002         4096 8月  1 16:55 /home/ha3
666105    4 drwx------   4 4322     4322         4096 8月  2 16:55 /home/app
666107    4 drwxr-xr-x   4 4322     4322         4096 7月 20 16:58 /home/app/.mozilla
666108    4 drwxr-xr-x   2 4322     4322         4096 8月 18  2010 /home/app/.mozilla/extensions
666109    4 drwxr-xr-x   2 4322     4322         4096 8月 18  2010 /home/app/.mozilla/plugins
666112    4 drwxr-xr-x   2 4322     4322         4096 11月 12  2010 /home/app/.gnome2

 

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

   find  /etc  -type  f  -size  +1k

[root@6 ~]# find /etc -type  f  -size  +1k  -ls
2098541    8 -rw-r--r--   1 root     root         4922 5月 11 02:37 /etc/oddjobd.conf
2098686    4 -rw-r--r--   1 root     root         2108 11月 11  2010 /etc/bluetooth/main.conf
2098455    4 -rwxr-xr-x   1 root     root         3078 5月 11 06:33 /etc/dhcp/dhclient.d/nis.sh
2098427    4 -rwxr-xr-x   1 root     root         2140 1月 26  2016 /etc/dhcp/dhclient.d/ntp.sh
2097538    4 -rw-r--r--   1 root     root         1833 8月  2 16:32 /etc/login.defs
2098786    8 -rw-r--r--   1 root     root         6682 5月 11 02:41 /etc/screenrc

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

  find   /etc   -not  -perm   /222

[root@6 ~]# find /etc -not -perm  /222 -ls
2097528    4 -r--------   1 root     root           45 7月 20 17:00 /etc/openldap/certs/password
2097181    4 ----------   1 root     root          749 8月 15 08:57 /etc/gshadow-
2098680    4 -r--r--r--   1 root     root          324 5月 11 01:32 /etc/ld.so.conf.d/kernel-2.6.32-642.el6.x86_64.conf
2099393    4 -r--r-----   1 root     root         3729 12月  8  2015 /etc/sudoers
2099204    4 -r--r--r--   1 root     root           76 2月 22 07:18 /etc/lvm/profile/thin-generic.profile
2099205    4 -r--r--r--   1 root     root           80 2月 22 07:18 /etc/lvm/profile/thin-performance.profile
2099201    4 -r--r--r--   1 root     root          338 2月 22 07:18 /etc/lvm/profile/cache-smq.profile
2099202    4 -r--r--r--   1 root     root         2391 5月 11 18:18 /etc/lvm/profile/command_profile_template.profile

7 、查找/etc 目录下至少有一类用户没有执行权限的文件

  find    /etc   -not  -perm     -111

[root@6 ~]# find /etc -not -perm -111  -ls
2099350    4 -rw-r--r--   1 root     root          291 5月 11 06:10 /etc/rsyslog.d/spice-vdagentd.conf
2098425    4 drwxr-x---   3 root     root         4096 5月 12 03:22 /etc/dhcp
2097538    4 -rw-r--r--   1 root     root         1833 8月  2 16:32 /etc/login.defs
2098786    8 -rw-r--r--   1 root     root         6682 5月 11 02:41 /etc/screenrc
2098783    4 -rw-r--r--   1 root     root           98 8月 16 08:54 /etc/resolv.conf
2097522    4 -rw-r--r--   1 root     root          662 8月 29  2007 /etc/logrotate.conf

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

  find    /etc/init.d/     -perm  -111 -a  -perm -002              

  find    /etc/init.d/     -perm  -113

[root@6 ~]# find /etc/init.d/ -perm -111 -a  -perm -002  -ls
2098781    0 -rwxr-xrwx   1 root     root            0 8月 16 12:45 /etc/init.d/a
[root@6 ~]# find    /etc/init.d/     -perm  -113
/etc/init.d/a

原创文章,作者:lvasu,如若转载,请注明出处:http://www.178linux.com/36470

评论列表(1条)

  • 马哥教育
    马哥教育 2016-08-19 12:02

    文章结构层次清晰,排版很精美,f有理论也有实践,对脚本的语法总结很详细,可以运用所学的脚本只是实现具体的功能来加深自己对脚本点理解。