一、条件判断
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$'
2.find
实时查找工具,通过遍历指定路径完成文件查找;
工作特点:
查找速度略慢
精确查找
实时查找
可能只搜索用户具备读取和执行权限的目录
find [OPTION]… [查找路径] [查找条件] [处理动作]
查找路径:指定具体目标路径;默认为当前目录
查找条件:指定的查找标准,可以文件名、大小、类型、权限等标准进行;默认为找出指定路径下的所有文件
处理动作:对符合条件的文件做操作,默认输出至屏幕
查找条件
(1).根据文件名和inode查找:
-name "文件名称":支持使用glob
*, ?, [], [^]
-iname "文件名称":不区分字母大小写
-inumn #:按inode号查找
-samefile name:相同inode号的文件
-links n :链接数为n的文件
-regex "PATTERN":以PATTERN匹配整个文件路径字符串,而不仅仅是文件名称
(2).根据属主、属组查找:
-user USERNAME:查找属主为指定用户(UID)的文件
-group GRPNAME: 查找属组为指定组(GID)的文件
-uidUserID:查找属主为指定的UID号的文件
-gidGroupID:查找属组为指定的GID号的文件
-nouser:查找没有属主的文件
-nogroup:查找没有属组的文件
(3).根据文件类型查找:
-type TYPE:
f: 普通文件
d: 目录文件
l: 符号链接文件
s:套接字文件
b: 块设备文件
c: 字符设备文件
p: 管道文件
(4).根据文件大小来查找:
-size [+|-] #
常用单位:k, M, G
# : (#-1, #],如:6k
-# :[0,#-1], 如:-6k
+# :(#,∞), 如:+6k
(5).根据时间戳:
以“天”为单位;
-atime[+|-] #,
#: [#,#+1)
+#: [#+1,∞]
-#: [0,#)
-mtime
-ctime
以“分钟”为单位:
-amin
-mmin
-cmin
(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才会匹配
组合条件:
与:-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
评论列表(1条)
总结的很详细,脚本那就是需要多谢多练,find命令对我们来说很重要的,也是个很有用的工具,所以需要好好练习哦