pstree -p 查看当前终端的进程树.

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 ]

echo $?

也就是[ A ==A ] 等于 test "$A" == "$A". 左右中括号与后面的参数之间必须有空格.

字符串测试

字符串测试:注意: 此表达式一般用于[[ ]]中;扩展的正则表达式

== 是否等于 示例: [[ a == b ]]中, a == b 与中括号之间都有空格.

ascii码是否大于ascii码

< 是否小于

!= 是否不等于

=~ 左侧字符串是否能够被右侧的PATTERN所匹配 即 左侧字符串是否包含右侧的,包含为真,不包含为假.

注意:用于字符串比较时的用到的操作数都应该使用引号

-z "STRING“ 字符串是否为空,空为真,不空为假,举例

A=123

[ -z $A ]

echo $?

1

-z是当变量有值的时候为假,没有被赋值的时候为真.

-n "STRING“ 字符串是否不空,不空为真,空为假,举例

A=123

[ -z $A ]

echo $?

-n是当变量有值的时候为真,没有被赋值的时候为假.

存在性测试

-a FILE:同-e FILE:
文件存在性测试,存在为真,否则为假

[ -e /etc/passwd ]等于test -e /etc/passwda 等于test -a /etc/passwda

echo $?

存在性及类别测试 -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 最小搜索目录深度

示例:

find -maxdepth 3 -name yangyang

查找当前目录下名为yangyang的文件,但最多递归3层。这三层包含.(.是当前目录)

find -mindepth 2 -name yangyahg

查找当前目录下名为yangyang的文件,但最少递归2层。这二层不包含.(.是当前目录)

只在第n层目录内查找

find -maxdepth 2 -mindepth 2 -name yangyahg

只在当前目录的第二层查找名为yangyang的文件。

根据文件名和inode查找: -name "文件名称":支持使用glob(通配符) *, ?, [], [^]

-iname "文件名称":不区分字母大小写

-inum n 按inode号查找

-samefile name 相同inode号的文件

-links n 链接数为n的文件 任何一个目录的链接数至少是2,因为有.(当前目录)和..(上个目录)两个链接 所以可以得出,目录的硬链接数减去2,就是这个目录的子目录数量。

-regextype posix-extended -regex "PATTERN(正则表达式)":以PATTERN匹配整个文件路径字符串,而 不仅仅是文件名称

find /app -regextype posix-egerp -regex '/app/.(r..t)...\1er' 前后的目录必须一致,否则报错.

查找app目录下,前后名字都有r..t且一致的文件

root555rooter

find -regextype posix-extended -regex './.(r..t)...\1er'是扩展正则,

./aroot123rooter

-regextype posix-basic -regex 是基本正则.

-regextype posix-egerp -regex意思是使用和egrep一样的正则表达式。

根据属主、属组查找:

-user USERNAME:查找属主为指定用户(UID)的文件

find -user yangyang

查找属主是yangyang的文件

-group GRPNAME: 查找属组为指定组(GID)的文件

find -group li

查找属组是li的文件。

-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 -a -not -name 条件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

附:创建指定大小的文件

dd if=/dev/zero of=/app/bigfile.img bs=1M count=5 bs是指定块的大小,count是块的个数。

在/app/下创建了一个名为bigfile.img且大小为5M的文件。

根据时间戳: 以“天”为单位; -atime [+|-]#, -atime 最近一次的访问时间

#: [#,#+1) #到#+1天前之间。 -mtime 最近一次的修改时间

+#: [#+1,∞] #+1天之前。 -ctime 最近一次的状态时间(权限,用户,组,大小,修改时间等)

-#: [0,#) #天以内。

-mtime -ctime 示例:查找app/目录下,10分钟之内时间戳发生改变的文件. # find /app -amin -10 以“分钟”为单位: -amin -mmin -cmin

根据权限查找: -perm [/|-]MODE (因为+从centos7开始淘汰,centos7里面只能用/来表示.)

/MODE:任何一类(u,g,o)对象的权限中只要能一位匹配即可,是或的关系 举例:

挑选出当前目录下.属主或属组或其他人权限上有写权限的文件.

find -perm /666

属主上有r,rw,w权限之一的, 或 属组上有r,rw,w权限之一的 或 其他人上有r,rw,w权限之一的的都会被匹配到.

r,rw,w三者满足其中之一即可,属主,属组,其他人只要有一项满足这些条件之一都符合.

PS: 如果是find -perm /000的话,只有/000才能匹配的到.

-MODE:每一类对象都必须同时拥有指定权限,是与的关系 举例: 挑选出当前目录下.属主,属组,其他人权限上都有写权限的文件.

find -perm -222

属主上有w rw,wx权限 且 属组上有w rw,wx权限 且 其他人上有w rw,wx权限的才会被匹配到.

三者之间必须同时满足条件才会被匹配到.

0 表示不关注,权限位为0的时候,使用或()关系判断的时候,会判断其他的权限位置. 使用与(-)关系判断的时候,有一处权限位不符合都不会再判断.

rw------- 1

-----w---- 2

-------wx 3

r-------- 4

find -perm 600

会匹配到1和4.

因为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指定的命令,对于每个文件执行命令之前 ,都会交互式要求用户确认

固定格式

find -name "*.sh" -exec chmod +x {} ;,将查找出来 *.sh 的文件加上执行权限x.

其中 -exrc和;是固定格式,分别代表开始和结束,exec后面跟命令,{}当中固定引用参数。 这里引用的参数就是 "*.sh"

对当前目录下,所有f开头的文件做一个备份,备份名字为文件名.orig

find -name "f*" -exec cp {} {}.orig ;

第一个{}是引用“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

echo “a b c d e” |xargs touch

相当于touch a b c d e xargs当中的参数,会一个一个的交给它后面的命令。

find -name “*.conf” -exec cp {} {}.orig ;

备份配置文件,添加.orig这个扩展名

find /tmp -ctime +3 -user joe -ok rm {} ;

提示删除存在时间超过3天以上的joe的临时文件,-ok会每一步都提醒。

find ~ -perm -002 -exec chmod o-w {} ;

在你的家目录中寻找可被其它用户写入的文件,并去除掉这个权限。

find /data –type f -perm 644 -name “*.sh” –exec chmod 755 {} ;

在/date目录下的普通文件。权限为644且以。sh结尾的,给这写文件的权限改为755.

find /home –type d -ls

列出家目录下的目录文件。