test命令
长格式的例子:
test "$A" == "$B" && echo "Strings are equal"
test “$A” -eq “$B” && echo "Integers are equal"
两个==是表示两个字符串是否完全相同的意思,-eq是两个数字是否相等的意思。
简写格式的例子:
[ "$A" == "$B" ] && echo "Strings are equal"
[ "$A" -eq "$B" ] && echo "Integers are equal
-v 用来检测一个变量是否被设置过值,若设置过则$?返回0,没设置过值返回1.
数值测试:
-gt 是否大于
-ge 是否大于等于
-eq 是否等于
-ne 是否不等于
-lt 是否小于
-le 是否小于等于
这些数值测试可以是整数或负数,甚至算数表达式来比较。但不支持小数点。
test有一个专用的命令中括号
左中括号[ 是一个命令,空格加右中括号是它的参数
具体如下:
也就是[ A ==A ] 等于 test "$A" == "$A".
左右中括号与后面的参数之间必须有空格.
字符串测试
字符串测试:注意: 此表达式一般用于[[ ]]中;扩展的正则表达式
== 是否等于 示例: [[ a == b ]]中, a == b 与中括号之间都有空格.
ascii码是否大于ascii码
< 是否小于
!= 是否不等于
=~ 左侧字符串是否能够被右侧的PATTERN所匹配 即 左侧字符串是否包含右侧的,包含为真,不包含为假.
注意:用于字符串比较时的用到的操作数都应该使用引号
-z "STRING“ 字符串是否为空,空为真,不空为假,举例
-z是当变量有值的时候为假,没有被赋值的时候为真.
-n "STRING“ 字符串是否不空,不空为真,空为假,举例
-n是当变量有值的时候为真,没有被赋值的时候为假.
存在性测试
-a FILE:同-e FILE:
文件存在性测试,存在为真,否则为假
存在性及类别测试
-b FILE:是否存在且为块设备文件
-c FILE:是否存在且为字符设备文件
-d FILE:是否存在且为目录文件
-f FILE:是否存在且为普通文件
-h FILE 或 -L FILE:存在且为符号链接文件
-p FILE:是否存在且为命名管道文件
-S FILE:是否存在且为套接字文件
权限测试
文件权限测试:
-r FILE:是否存在且可读
-w FILE: 是否存在且可写
-x FILE: 是否存在且可执行
[ -r /app/passwd -o -w /app/passwd ] 判断/app/passwd文件是否存在,并拥有读或写的权限. 不能写为 -rw
[ -r /app/passwd -a -w /app/passwd ] 判断/app/passwd文件是否存在,并拥有读和写的权限. 不能写为 -rw
文件特殊权限测试:
-u FILE:是否存在且拥有suid权限
-g FILE:是否存在且拥有sgid权限
-k FILE:是否存在且拥有sticky权限
文件大小测试:
-s FILE: 是否存在且非空
文件是否打开:
-t fd: fd 文件描述符是否在某终端已经打开
-N FILE:文件自从上一次被读取之后是否被修改过
-O FILE:当前有效用户是否为文件属主
-G FILE:当前有效用户是否为文件属组
双目测试:
FILE1 -ef FILE2: FILE1是否是FILE2的硬链接
FILE1 -nt FILE2: FILE1是否新于FILE2(mtime)
FILE1 -ot FILE2: FILE1是否旧于FILE2
多条件判断.并且,或者,非..
第一种方式:
COMMAND1 && COMMAND2 并且 &&等于 -a
COMMAND1 || COMMAND2 或者 ||等于 -o
! COMMAND 非
如:[[ -r FILE ]] && [[ -w FILE ]] 等于 [ -r /app/passwd -a -w /app/passwd ]
[[ -r FILE ]] || [[ -w FILE ]] 等于 [ -r /app/passwd -o -w /app/passwd ]
第二种方式:
条件1 -a 条件2 并且
条件1 -o 条件2 或者
! EXPRESSION
必须使用测试命令进行,即test或[]
文件查找
locate 基于数据库来查找文件,是非及时性查找。通过数据库文件数据库位置 /var/lib/mlocate/mlocate.db来进行
更新,使用updatedb命令可以更新数据库。
locate 的搜索,只会依赖于事先构建的索引,索引的构建是在系统较为空闲时自动进行(周期性任务)。索引构建后的
数据,不会立即生效,需要管理员手动更新数据库(updatedb)。索引构建过程需要遍历整个根文件系统,极消耗资源。
locate特点:
1 查找速度快
2 模糊查找 包含关键字的也会显示
3 非实时查找 只会基于上一次的索引,除非管理员手动更新数据库(updatedb)
4 搜索的是文件的全路径,不仅仅是文件名 包含关键字的路径也会被显示出来。
5 可能只搜索用户具备读取和执行权限的目录 如果要搜索的用户没有对a目标有rx权限,那么a目标不会显示。
(rx,x代表能进,r代表能列)
locate +关键字
– -i 不区分大小写的搜索
– -n N 只列举前N个匹配项目 示例: -n 2 表示只显示结果的前两个。
– -r 使用正则表达式
示例:
搜索名称或路径中带有“conf”的文件 locate conf
使用Regex(正则表达式)来搜索以“.conf”结尾的文件
locate -r ‘.conf$’
find查找工具 实时查找工具,通过遍历指定路径完成文件查找 如果什么条件都不指定,则将当前目录及子目录的
所有文件都列出来。
工作特点:
1 查找速度略慢
2 精确查找
3 实时查找
4 可能只搜索用户具备读取和执行权限的目录 如果要搜索的用户没有对a目标有rx权限,那么a目标不会显示。
(rx,x代表能进,r代表能列)
语法:
find [OPTION]... [查找路径] [查找条件] [处理动作]
查找路径:指定具体目标路径;默认为当前目录,且会递归。
查找条件:指定的查找标准,可以文件名、大小、类型、权限等标准进行;默认为找出指定路径下的所有文件
处理动作:对符合条件的文件做操作,默认输出至屏幕
查找条件具体有如下几种:
搜索层级 默认全部递归,不管被搜索的目录是几层都会全部递归。
-maxdepth level 最大搜索目录深度,指定目录为第1级
-mindepth level 最小搜索目录深度
示例:
只在第n层目录内查找
根据文件名和inode查找:
-name "文件名称":支持使用glob(通配符) *, ?, [], [^]
-iname "文件名称":不区分字母大小写
-inum n 按inode号查找
-samefile name 相同inode号的文件
-links n 链接数为n的文件 任何一个目录的链接数至少是2,因为有.(当前目录)和..(上个目录)两个链接
所以可以得出,目录的硬链接数减去2,就是这个目录的子目录数量。
-regextype posix-extended -regex "PATTERN(正则表达式)":以PATTERN匹配整个文件路径字符串,而
不仅仅是文件名称
查找app目录下,前后名字都有r..t且一致的文件
-regextype posix-basic -regex 是基本正则.
-regextype posix-egerp -regex意思是使用和egrep一样的正则表达式。
根据属主、属组查找:
-user USERNAME:查找属主为指定用户(UID)的文件
-group GRPNAME: 查找属组为指定组(GID)的文件
-uid UserID:查找属主为指定的UID号的文件
-gid GroupID:查找属组为指定的GID号的文件
-nouser:查找没有属主的文件 因为用户被删除,所以看不到用户名了,但uid号还在的文件用此办法查看
-nogroup:查找没有属组的文件 因为组被删除,所以看不到组名了,但gid号还在的文件用此办法查看
根据文件类型查找: -type TYPE:
f: 普通文件 示例 # find -type f # 显示所有普通文件
d: 目录文件
l: 符号链接文件 即软链接
s:套接字文件 即网络端口通信文件。
b: 块设备文件
c: 字符设备文件 显示终端信息。
p: 管道文件
组合条件查找
组合条件:默认是与的关系,即-a
与:-a 或:-o 非:-not, ! !-a = -o (非与即或 )!-o = -a(非或即与)
条件1 -a 条件2 同时满足这两个条件
条件1 -o 条件2 满足其中给一个即可
(非 A)或(非 B) =非(A且 B)
(非 A)且(非 B) =非(A或 B)
!A-a !B = !(A-o B) 非条件1与非条件2 等于 非(条件1或条件2)
!A-o !B = !(A-a B) 非条件1和非条件2 等于 非(条件1或条件2)
条件1 -o 条件2 相当于数学中的并集
条件1 -a 条件2 相当于数学中的交集
#find -not ( -name 条件1 -o -name 条件2 )
find示例
find -name snow.png
查找当前目录下,名字精确为snow.png的文件,区分大小写
find -iname snow.png
查找当前目录下,名字精确为snow.png的文件,不区分大小写
find /-name “*.txt”
查找根目录下,名字精确以.txt结尾的文件
find /var–name “log”
查找var目录下,名字包含log的文件.
find -user joe -group joe
查找当前目录下,属主为joe,且属组为joe的文件
find -user joe -not -group joe
查找当前目录下,属主为joe,且属组不是joe的文件.
find -user joe -o -user jane
查找当前目录下,属主是joe或jine的文件
find -not( -user joe -o -user jane )
查找根目录下的,属主不是joe和jine的文件
find / -user joe -o -uid 500
查找根目录下,属主是joe或UID号为500的文件.
找出/tmp目录下,属主不是root,且文件名不以f开头的文件
find /tmp ( -not -user root -a -not -name ‘f‘ ) -ls
find /tmp -not ( -user root -o -name ‘f‘ ) -ls
排除目录示例:固定格式: -path ‘目录名’ -a -prune 排除一个指定目录
查找/etc/下,除/etc/sane.d目录的其它所有.conf后缀的文件
find /etc -path ‘etc/sane.d‘ -a -prune -o -name ‘*.conf‘
查找/etc/下,除/etc/sane.d和/etc/fonts两个目录的其它所有.conf后缀的文件
find /etc ( -path ‘/etc/sane.d‘ -o -path ‘etc/fonts‘ ) -a -prune -o -name "*.conf"
根据文件大小来查找:
-size [+|-]#UNIT
常用单位:k, M, G,c(byte)
输入单位#: (#-1, #] 大于等于#-1,到小于#之间。 中括号有大于等于的意思。小括号有小于的意思.
如:6k 表示(5k,6k] 5K到6K之间。
输入单位 -#:[0,#-1] 大于等于0.小于等于#-1
如:6k 表示[0,5k]
输入单位 +#:(#,∞) 大于等于#+1到正无限大,不包含输入的数值本身。
如:+6k 表示(6k,∞)
示例:
查找大于5M的文件 # find -size +5M
查找小于5M的文件 # find -size -6M
查找大于5M,小于6M的文件 # find -size 5M
附:创建指定大小的文件
根据时间戳:
以“天”为单位; -atime [+|-]#, -atime 最近一次的访问时间
#: [#,#+1) #到#+1天前之间。 -mtime 最近一次的修改时间
+#: [#+1,∞] #+1天之前。 -ctime 最近一次的状态时间(权限,用户,组,大小,修改时间等)
-#: [0,#) #天以内。
-mtime -ctime 示例:查找app/目录下,10分钟之内时间戳发生改变的文件.
以“分钟”为单位:
-amin -mmin -cmin
根据权限查找: -perm [/|-]MODE (因为+从centos7开始淘汰,centos7里面只能用/来表示.)
/MODE:任何一类(u,g,o)对象的权限中只要能一位匹配即可,是或的关系 举例:
挑选出当前目录下.属主或属组或其他人权限上有写权限的文件.
r,rw,w三者满足其中之一即可,属主,属组,其他人只要有一项满足这些条件之一都符合.
PS: 如果是find -perm /000的话,只有/000才能匹配的到.
-MODE:每一类对象都必须同时拥有指定权限,是与的关系 举例:
挑选出当前目录下.属主,属组,其他人权限上都有写权限的文件.
三者之间必须同时满足条件才会被匹配到.
0 表示不关注,权限位为0的时候,使用或()关系判断的时候,会判断其他的权限位置.
使用与(-)关系判断的时候,有一处权限位不符合都不会再判断.
因为6里面包括r和w,属主上包括r的只有1和4,而属组和其他上都是0,
0表示不关心,故2和3虽然分别在其他人及属组上有符合的条件,但是不匹配.
同理,如果匹配项是022的话,值会匹配2和3.
find -perm 755 会匹配权限模式恰好是755的文件,与的关系时,仅匹配755.
或的关系时候,任何一位上满足条件都会列出.
只要当任意人有写权限时,find -perm +222就会匹配
只有当每个人都有写权限时,find -perm -222才会匹配
只有当其它人(other)有写权限时,find -perm -002才会匹配
查找后的处理动作: 通常放在命令最后
-print:默认的处理动作,显示至屏幕
-ls:类似于对查找到的文件执行“ls -l”命令
-delete:删除查找到的文件
fls file:查找到的所有文件的长格式信息保存至指定文件中
主要保存inode号,软链接次数,权限,之类的信息类似于ls -l后,显示的内容。
-ok COMMAND {} \; 对查找到的每个文件执行由COMMAND指定的命令,对于每个文件执行命令之前
,都会交互式要求用户确认
固定格式
其中 -exrc和\;是固定格式,分别代表开始和结束,exec后面跟命令,{}当中固定引用参数。
这里引用的参数就是 "*.sh"
对当前目录下,所有f开头的文件做一个备份,备份名字为文件名.orig
如果将 -exec 改为 -OK 的话,那么电脑会在每一步都会发出询问。
参数替换:xargs
find和xargs格式:find | xargs COMMAND(命令)
由于很多命令不支持管道|来传递参数,而日常工作中有这个必要,所以就有了xargs命令
xargs用于产生某个命令的参数,xargs 可以读入 stdin(标准输入) 的数据,并且以空格符或回车符将 stdin
的数据分隔成为arguments(参数)
注意:文件名或者是其他意义的名词内含有空格符的情况
有些命令不能接受过多参数,命令执行可能会失败,xargs可以解决
示例:
ls f* |xargs rm 删除列出的文件
find /sbin -perm +700 |ls -l 这个命令是错误的,ls不支持接受管道传递过来的参数.
find /sbin -perm +7000 | xargs ls –l
备份配置文件,添加.orig这个扩展名
提示删除存在时间超过3天以上的joe的临时文件,-ok会每一步都提醒。
在你的家目录中寻找可被其它用户写入的文件,并去除掉这个权限。
在/date目录下的普通文件。权限为644且以。sh结尾的,给这写文件的权限改为755.
马哥学习--李洋个人笔记之条件判断test及文件查找find
原文:http://blog.51cto.com/13477118/2124758