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

一、条件判断

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)
上一篇 2016-08-15 11:58
下一篇 2016-08-15 11:59

相关推荐

  • 文件系统权限管理

    文件系统权限管理 文件及目录权限 文件系统上的权限是针对访问者的 访问者:     owner:属主,u     group:属组,g     other:其他,o 针对每个访问者有三种权限 r:readable w:writeable x…

    Linux干货 2016-11-05
  • Linux删除特殊字符文件

    由于很多原因可能会导致一些文件的文件名是乱码,当我们删除的时候就会发现这个文件名既不能自动补全,也不能直接删除。

    2017-11-11
  • 第十周

    1、请详细描述CentOS系统的启动流程(详细到每个过程系统做了哪些事情) 1.开启电源后,POST自检:检查硬件设备,通过后交给BIOS 2.BIOS加载可选择的启动设备,寻找可引导的启动设备的记录:MBR 3.MBR:硬盘的主引导记录,存在于0磁道0扇区,共512字节.其中Bootloader占用446字节,分区表占用64字节,magic nu…

    Linux干货 2016-10-17
  • Shell 脚本作业(8月11号)

    1、编写脚本/root/bin/systeminfo.sh,显示当前主机系统信息,包括主机名,IPv4地址,操作系统版本,内核版本,CPU型号,内存大小,硬盘大小。 #!/bin/bash # author:huiping # version:1.0.1 # date:2016-08-11 # describe:&nb…

    Linux干货 2016-08-15
  • 设计模式 ( 十七) 状态模式State(对象行为型)

    设计模式 ( 十七) 状态模式State(对象行为型) 1.概述 在软件开发过程中,应用程序可能会根据不同的情况作出不同的处理。最直接的解决方案是将这些所有可能发生的情况全都考虑到。然后使用if… ellse语句来做状态判断来进行不同情况的处理。但是对复杂状态的判断就显得“力不从心了”。随着增加新的状态或者修改一个状体(if else(或swit…

    Linux干货 2015-07-27
  • N22-第六周作业

    请详细总结vim编辑器的使用并完成以下练习题      vim是模式化的文本编辑器。在不同模式下,每一次按键的效果都不一样。vim有三种工作模式,分别是编辑模式,插入模式和末行模式。编辑模式是打开vim后的默认模式,用于查看文本或进行复制,粘贴,删除等编辑命令。插入模式是为了向文本中输入信息。末行模式是vim自带的命令行接口,能…

    Linux干货 2016-09-26

评论列表(1条)

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

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