条件判断、文件查找与压缩

一、条件判断

1.条件选择if语句
   选择执行:
   注意:if语句可嵌套

(1).单分支
if 判断条件:then
   条件为真的分支代码
fi

(2).双分支
if 判断条件; then
   条件为真的分支代码
else
   条件为假的分支代码
fi

(3).多分支
if 判断条件; then
    条件为真的分支代码
elif 判断条件; then
    条件为真的分支代码
elif 判断条件; then
    条件为真的分支代码

else
    条件为假的分支代码
fi

逐条件进行判断,第一次遇为“真”条件时,执行其分支,而后结束整个if语句

if实例
根据命令的退出状态来执行命令
if ping -c 1 -W 2 station1 &> /dev/null;then
    echo 'Station1 is UP'
elif grep "station1" ~/maintenance.txt &> /dev/null;then
    echo 'Station1 is under going maintenance'
else echo 'Station1 is unexpectedly DOWN!' exit 1
fi

2.条件判断:case语句

case 变量引用 in
PAT1)
    分支1
    ;;
PAT2)
    分支2
    ;;

*)
    默认分支
    ;;
esac

case支持glob风格的通配符:
*: 任意长度任意字符
?: 任意单个字符
[]:指定范围内的任意单个字符
a|b: a或b

二、文件查找

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

1.locate
查询系统上预建的文件索引数据库:/var/lib/mlocate/mlocate.db

依赖于事先构建的索引;
索引的构建是在系统较为空闲时自动进行(周期性任务);管理员手动更新数据库(updatedb);
索引构建过程需要遍历整个根文件系统,极消耗资源;

工作特点:
查找速度快;
模糊查找;
非实时查找
搜索的是文件的全路径,不仅仅是文件名
可能只搜索用户具备读取和执行权限的目录

locate KEYWORD
选项
-i:执行区分大小写的搜索
-n X:只列举前X个匹配项目
-b:只匹配路径中的基名
-c:统计符合条件的数量
-r "PATTERN":支持基础正则表达式
例如:
搜索名称或路径中带有“foo”的文件
locate foo
使用Regex来搜索以“.foo”结尾的文件
locate -r '\.foo$'

Image 001.png

Image 002.png

Image 003.png

2.find
实时查找工具,通过遍历指定路径完成文件查找;

工作特点:
查找速度略慢
精确查找
实时查找
可能只搜索用户具备读取和执行权限的目录

find [OPTION]… [查找路径] [查找条件] [处理动作]
查找路径:指定具体目标路径;默认为当前目录
查找条件:指定的查找标准,可以文件名、大小、类型、权限等标准进行;默认为找出指定路径下的所有文件
处理动作:对符合条件的文件做操作,默认输出至屏幕

查找条件

(1).根据文件名和inode查找:
-name "文件名称":支持使用glob
*, ?, [], [^]
-iname "文件名称":不区分字母大小写
-inumn #:按inode号查找
-samefile name:相同inode号的文件
-links n :链接数为n的文件
-regex "PATTERN":以PATTERN匹配整个文件路径字符串,而不仅仅是文件名称

Image 004.png

Image 005.png

Image 006.png

(2).根据属主、属组查找:

-user USERNAME:查找属主为指定用户(UID)的文件
-group GRPNAME: 查找属组为指定组(GID)的文件
-uidUserID:查找属主为指定的UID号的文件
-gidGroupID:查找属组为指定的GID号的文件
-nouser:查找没有属主的文件
-nogroup:查找没有属组的文件

Image 007.png

Image 009.png

Image 010.png

(3).根据文件类型查找:

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

Image 010.png

(4).根据文件大小来查找:

-size [+|-] #
常用单位:k, M, G
# : (#-1, #],如:6k
-# :[0,#-1], 如:-6k
+# :(#,∞), 如:+6k
Image 011.png
(5).根据时间戳:
以“天”为单位;
-atime[+|-] #,
#: [#,#+1)
+#: [#+1,∞]
-#: [0,#)
-mtime
-ctime
以“分钟”为单位:
-amin
-mmin
-cmin
Image 012.png(6).根据权限查找:
-perm [/|-] MODE
MODE: 精确权限匹配
/MODE:任何一类(u,g,o)对象的权限中只要能一位匹配即可,或关系,+ 从centos7开始淘汰
-MODE:每一类对象都必须同时拥有指定权限,与关系
0 表示不关注
find -perm 755会匹配权限模式恰好是755的文件
只要当任意人有写权限时,find -perm +222就会匹配
只有当每个人都有写权限时,find -perm -222才会匹配
只有当其它人(other)有写权限时,find -perm -002才会匹配
Image 013.png组合条件:
与:-a
或:-o
非:-not, !
德·摩根定律:
非(P 且Q) = (非P) 或(非Q)
非(P 或Q) = (非P) 且(非Q)
!A -a !B = !(A -o B)
!A -o !B = !(A -a B)

处理动作
-print:默认的处理动作,显示至屏幕;
-ls:类似于对查找到的文件执行“ls -l”命令
-delete:删除查找到的文件;
-flsfile:查找到的所有文件的长格式信息保存至指定文件中
-ok COMMAND {} \; 对查找到的每个文件执行由COMMAND指定的命令;对于每个文件执行命令之前,都会交互式要求用户确认
-exec COMMAND {} \; 对查找到的每个文件执行由COMMAND指定的命令
{}: 用于引用查找到的文件名称自身
find传递查找到的文件至后面指定的命令时,查找到所有符合条件的文件一次性传递给后面的命令
有些命令不能接受过多参数,此时命令执行可能会失败,下面方式可规避此问题find | xargs COMMAND
排除目录find /etc-path ‘/etc/sane.d’ -a -prune -o -name *.conf-print

find实例
搜索名为snow.png的文件
find -name snow.png

不分大小写地搜索名为snow.png、Snow.png、SNOW.PNG等等的文件
find -iname snow.png
find / -name *.txt
find /var –name *log*
find-userjoe -groupjoe

搜索被用户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,且文件名不是fstab的文件
find /tmp \( -not -user root -a -not -name 'fstab' \) -ls
find /tmp -not \( -user root -o -name 'fstab' \) –ls

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

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

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

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

2.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

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

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

5.zip/unzip
  zip –r sysconfigsysconfig/
  unzip sysconfig.zip
cat /var/log/messages | zip message –
unzip -p message > message

6.tar
  tar [OPTION]…
(1) 创建归档
tar -c -f /PATH/TO/SOMEFILE.tar FILE…
tar cf/PATH/TO/SOMEFILE.tar FILE…
(2) 查看归档文件中的文件列表
tar -t -f /PATH/TO/SOMEFILE.tar
(3) 展开归档
tar -x -f /PATH/TO/SOMEFILE.tar
tar -x -f /PATH/TO/SOMEFILE.tar -C /PATH/
结合压缩工具实现:归档并压缩
-j: bzip2, -z: gzip, -J: xz

7.cpio复制从或到文件
cpio命令是通过重定向的方式将文件进行打包备份,还原恢复的工具,它可以解压以“.cpio”或者“.tar”结尾的文件。
cpio[选项] > 文件名或者设备名
cpio[选项] < 文件名或者设备名
选项
-o 将文件拷贝打包成文件或者将文件输出到设备上
-i 解包,将打包文件解压或将设备上的备份还原到系统
-t 预览,查看文件内容或者输出到设备上的文件内容
-v 显示打包过程中的文件名称。
-d 解包生成目录,在cpio还原时,自动的建立目录
-c 一种较新的存储方式

实例
将etc目录备份:
find ./etc -print | cpio -ov > etc.cpio
内容预览
cpio –tv < etc.cpio
解包文件
cpio –iv <etc.cpio
cpio –idv < etc.cpio

条件判断
1、写一个脚本/root/bin/createuser.sh,
     实现如下功能:使用一个用户名做为参数,如果指定参数的用户存在,就显   示其存在,否则添加之;显示添加的用户的id号等信息
    

#!/bin/bash
     if id $1 &> /dev/null ;then 
         echo "user $1 exists" 
     else useradd $1 && id $1
     fi

2、写一个脚本/root/bin/yesorno.sh,提示用户输入yes或no,并判断用户输入的是yes还是no,或是其它信息
    

#!/bin/bash
     read -p "Please input a select (yes|no):" answer
     case $answer in
     [Yy]|[Yy][Ee][Ss])
         echo -e "Your select is \033[31myes\033[0m"
         ;;
     [Nn]|[Nn][Oo])
         echo -e "Your select is \033[31mno\033[0m"
         ;;
     *)
         echo -e "This is a not good answer"
     esac
     ##!/bin/bash
     #read -p "Please input a select (yes|no):" input
     #answer=`echo $input | tr "A-Z" "a-z"` 
     #case $answer in
     #yes)
     #    echo -e "Your select is \033[31myes\033[0m"
     #    ;;
     #no)
     #    echo -e "Your select is \033[31mno\033[0m"
     #    ;;
     #*)
     #     echo -e "This is a not good answer"
     #esac

3、写一个脚本/root/bin/filetype.sh,判断用户输入文件路径,显示其文件类型(普通,目录,链接,其它文件类型)
   

  #!/bin/bash
     read -p "Please input a filename:" filename
     if test -e $filename;then
         if test -f $filename;then
             echo "regular file"
         elif test -d $filename;then
             echo "dirctory"
         elif test -h $filename;then
             echo "link"
         else
             echo "other"
         fi
    else 
        echo "$filename not exist"
    fi

4、写一个脚本/root/bin/checkint.sh,判断用户输入的参数是否为正整数
   

 #!/bin/bash
    if [[ $1 =~ ^0*[1-9][0-9]*$ ]];then
        echo "int"
    else
        echo "not int"
    fi
     
    ##!/bin/bash
    #if expr $1 + 0 &> /dev/null;then  
    #    echo "int"
    #else
    #    echo "not int"
    #fi

    
文件查找
1、查找/var目录下属主为root,且属组为mail的所有文件
     find /var -user root -group mail
2、查找/var目录下不属于root、lp、gdm的所有文件
     find /var -not \( -user root -o -user lp -o -user gdm \)
3、查找/var目录下最近一周内其内容修改过,同时属主不为root,也不是postfix的文件
     find /var -mtime -7 -not \( -user root -o -user postfix \)
4、查找当前系统上没有属主或属组,且最近一个周内曾被访问过的文件
     find / -nouser -o -nogroup -atime -7
5、查找/etc目录下大于1M且类型为普通文件的所有文件
     find /etc -size +1M -type f
6、查找/etc目录下所有用户都没有写权限的文件
     find /etc -not -perm +222
7、查找/etc目录下至少有一类用户没有执行权限的文件
     find /etc -not -perm -111
8、查找/etc/init.d目录下,所有用户都有执行权限,且其它用户有写权限的文件
     find /etc/init.d -perm -113

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

(0)
anonymousanonymous
上一篇 2016-08-15
下一篇 2016-08-15

相关推荐

  • Linux 启动流程

    Linux启动流程 POST–>Boot Sequence–>MBR–>Grub–>Kernel(initramfs)–>rootfs–chroot(根切换)–>/sbin/init–>RunLevel–&gt…

    Linux干货 2016-06-09
  • 再不自动化就晚啦!优云教你4步打造基于CentOS的产品镜像

    随着Linux程序的增多,软件的安装过程中经常出现如下问题: 1、硬件配置类似或者相同时,批量安装系统和软件,希望实现自动化安装,减少安装时间和人为出错。 2、工程实施人员在不同客户现场进行系统和软件安装(硬件配置不同),由于硬件有差别,不容易实现自动化。 笔者针对以上场景,从提高生产效率,减少误操作的立场,提出如下解决方案,希望能达到抛砖引玉的目的,并能与…

    系统运维 2016-07-16
  • LVM相关使用

    前言: LVM是 Logical Volume Manager(逻辑卷管理)的简写,它是Linux环境下对磁盘分区进行管理的一种机制,它由Heinz Mauelshagen在Linux 2.4内核上实现,Linux用户安装Linux操作系统时遇到的一个常见的难以决定的问题就是如何正确地评估各分区大小,以分配合适的硬盘空间。普通的磁盘分区管理方式在逻辑分区划分…

    Linux干货 2017-08-13
  • vim 编辑器 定时任务 bash基础

    vim 编辑器 定时任务 bash基础

    2017-10-17
  • Linux的用户组和权限(一)

    导读:本章主要内容如下       1.解释Linux的安全模型      2.解释用户账号和组群账号的目的      3.用户和组管理命令      4.理解并设置文件权限 &n…

    Linux干货 2016-08-04
  • ACL权限实例详解

    CentOS7当中,无论是操作系统安装时还是之后手工创建的文件系统(xfs、ext4)均会开启ACL功能。 CentOS6及之前的版本,仅操作系统安装时创建的文件系统才会默认开启ACL,手工创建的文件系统,需要手工开启ACL 功能。 Acl如何设置 创建分区 mount -o acl /dev/sda7  取消的方式,重新挂载时不指定即可 tune…

    2017-07-29

评论列表(1条)

  • 马哥教育
    马哥教育 2016-08-19 09:17

    总结的很详细,脚本那就是需要多谢多练,find命令对我们来说很重要的,也是个很有用的工具,所以需要好好练习哦