千家信息网

8、周期性任务、find、break和continue 学习笔记

发表于:2026-11-04 作者:千家信息网编辑
千家信息网最后更新 2026年11月04日,find [options] [查找路径] [查找条件] [处理动作]查找路径:默认为当前目录查找条件:默认为查找指定路径下的所有文件处理动作:默认为显示查找条件:-name "文件名称" 支持使用g
千家信息网最后更新 2026年11月04日8、周期性任务、find、break和continue 学习笔记

find [options] [查找路径] [查找条件] [处理动作]

查找路径:默认为当前目录

查找条件:默认为查找指定路径下的所有文件

处理动作:默认为显示


查找条件:

-name "文件名称" 支持使用globbing正则表达式

-iname "文件名称" 查找时不区分字符大小写


-user UserName 根据属主查找

-group GroupName 根据属组查找


-uid UID 根据uid查找

-gid GID 根据gid查找


-nouser 查找没有属主的文件

-nogroup 查找没有属组的文件


组合条件:

-a 与,同时满足

-o 或,满足其一

-not, ! 非,取反


-type: 根据文件类型查找

f: 普通文件

d: 目录

b: 块设备

c: 字符设备

l: 符号链接文件

p: 命名管道

s: 套接字


-size: 根据文件大小查找(常用单位:k, M, G)

-#M 查找所有文件大小小于#M的文件

+#M 查找所有文件大小大于#M的文件

#M 查找所有文件大小等于#M的文件


根据时间戳查找:

以天为单位(time):

-atime

-mtime

-ctime

+# 查找(#+1)天之外被访问过的文件

-# 查找#天之内被访问过的文件

查找短于(#+1)> x >=#天的时间段被访问过


以分钟为单位(min):

-amin

-mmin

-cmin

+# 查找(#+1)分之外被访问过的文件

-# 查找#天之分被访问过的文件

查找短于(#+1)> x >=#分的时间段被访问过


根据权限查找:

-perm [+|-]MODE

MODE 精确匹配

+MODE 任何一类用户的任何一位权限匹配;常用于查找某类用户的某特定权限是否存在;

-MODE 每类用户的指定要检查的权限位都匹配;


文件权限:644

-perm 600 否,因为不匹配644

-perm +222 是,因为任何一位有2权限

-perm +002 否,因为任何一位的权限都不匹配

-perm -444 是,因为每位的4权限都匹配



练习:

1、查找/var/目录属主为root且属组为mail的所有文件;

# find /var/ -user root -a -group mail


2、查找/usr目录下不属于root、bin或hadoop的所用文件;

# find /usr/ -not -user root -a -not -user bin -a -not -user hadoop

# find /usr/ -not \( -user root -o -user bin -o -user hadoop \)



3、查找/etc/目录下最近一周内其内容修改过的,且不属于root或hadoop的文件;

# find /etc/ -mtime -7 -a -not -user root -a -not -user hadoop

# find /etc/ -mtime -7 -a -not \( -user root -o -user hadoop \)



4、查找当前系统上没有属主或属组,且最近1个月内曾被访问过的文件;

# find / \( -nouser -o -nogroup \) -a -atime -30


5、查找/etc/目录下大于1M且类型为普通文件的所有文件;

# find /etc/ -size +1M -a -type f



6、查找/etc/目录所有用户都没有写权限的文件;

# find /etc/ -not -perm +222

所有都没有:相反:任何一个有

所有都有:相反:至少有一个没有


7、查找/etc/目录下至少有一类用户没有写权限;

# find /etc/ -not -perm -222


8、查找/etc/init.d/目录下,所有用户都有执行权限且其它用户有写权限的文件;

# find /etc/init.d/ -perm -113



处理动作:

-print 默认打印在标准输出上

-ls 以长格式输出各文件信息

-exec COMMAND {} \; 对查找到的文件执行指定的命令

-ok COMMAND {} \; 交互式的-exec;

| xargs COMMAND




find补充材料(摘自互联网):



find与xargs

在使用find命令的-exec选项处理匹配到的文件时, find命令将所有匹配到的文件一起传递给exec执行。但有些系统对能够传递给exec的命令长度有限制,这样在find命令运行几分钟之后,就会出现 溢出错误。

错误信息通常是"参数列太长"或"参数列溢出"。这就是xargs命令的用处所在,特别是与find命令一起使用。


find命令把匹配到的文件传递给xargs命令,而xargs命令每次只获取一部分文件而不是全部,不像-exec选项那样。这样它可以先处理最先获取的一部分文件,然后是下一批,并如此继续下去。


在有些系统中,使用-exec选项会为处理每一个匹配到的文件而发起一个相应的进程,并非将匹配到的文件全部作为参数一次执行;这样在有些情况下就会出现进程过多,系统性能下降的问题,因而效率不高;


而使用xargs命令则只有一个进程。另外,在使用xargs命令时,究竟是一次获取所有的参数,还是分批取得参数,以及每一次获取参数的数目都会根据该命令的选项及系统内核中相应的可调参数来确定。



文件的特殊权限:


可执行文件:suid

任何用户执行此可执行文件时,不再以用户自己的身份当作进程的属主,而是以文件的属主当作进程的属主

suid表现为文件属主执行权限位上的s或S,有执行权限的为s而没有执行权限的为S

如何设定suid权限:

chmod u+s FILE


目录文件:sgid

具有sgid的目录,用户在此目录下创建文件时,新建文件的属组不再是用户所属的基本组,而是目录的属组


sgid表现为文件属组执行权限位上的s或S,有执行权限的为s而没有执行权限的为S


如何设定sgid权限:

chmod g+s FILE ...


粘滞位:sticky

对于公共可写的目录,用户可创建文件,可以删除自己的文件,但无法删除别的用户的文件


sticky表示为文件其它用户执行权限位上的t或T,,有执行权限的为t而没有执行权限的为T


如何设定sticky权限:

chmod o+t FILE ...



练习:

1、复制cat命令至/tmp目录,普通用户使用/tmp/cat命令能查看root用户有权限查看的所有文件

cp `which cat` /tmp/

cp /etc/shadow /tmp/

chmod u+s cat

2、新建/tmp/test目录:

要求openstack和docker用户对其有写权限,且在目录创建的文件的属组都为cloud组

要求每个用户不能删除别人的文件,但可以编辑

mkdir /tmp/test

groupadd cloud

useradd -G cloud openstack

useradd -G cloud docker

chmod g+w /tmp/test/

chown :cloud /tmp/test

chmod g+s test/


Linux任务计划:

一次性任务执行:at

周期性任务执行:crontab


一次性任务执行:

at:

交互式:让用户在at>提示符输入多个要执行命令;

at TIME

at>

Ctrl+d:提交任务;

批处理:将任务的各命令写入文件由at进行调用;


at -f /path/to/at_job_file TIME



at作业有队列:使用单个字母表示

查看作业:at -l = atq


删除一个尚未执行的作业:

at -d job_num

atrm job_num


任务计划的执行结果会通过邮件的方式发送给任务提交者;


mail命令:

交互模式接收邮件;

交互模式发送邮件:

-s "Subject"

< /path/to/somefile



周期性任务计划:cron

crond: 守护进程

服务进程: 阻塞,轮询


系统cron:

文件:/etc/crontab

用户cron:

/var/spool/cron/UserName



/etc/crontab文件:每行定义一个独立的任务;


SHELL=/bin/bash

PATH=/sbin:/bin:/usr/sbin:/usr/bin

MAILTO=root

HOME=/


# For details see man 4 crontabs


# Example of job definition:

# .---------------- minute (0 - 59)

# | .------------- hour (0 - 23)

# | | .---------- day of month (1 - 31)

# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...

# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat

# | | | | |

# * * * * * user-name command to be executed


时间表示法:

1、每个时间位都应该使用其可用的有效取值范围内的值;

2、某时间位上的*表示对应位的所有有效取值;

3、-: 连续的时间相邻点取值;

4、,: 离散的时间点取值;

5、/#:表示在指定时间范围内每隔#一次;


注意:通过输出重定向而拒收邮件:

将执行结果重定向到/dev/null

&> /dev/null

将邮件发给空用户

MAILTO=""



用户cron:

使用crontab命令来实现

-l: 查看自己的cron任务列表;

-e: 通过EDITOR变量中定义的编辑器打开用户自己的cron配置文件;

编辑单独的任务都使用-e选项,无论是删除、修改还是新建;

-r: 移除crontab文件


如果是管理员:

-u UserName:为别的用户配置crontab作业;

# crontab -e -u docker


提醒:如果在crontab的用户命令中使用%,得转义为\%

5 3 * * * /bin/touch ~/testfile_`date +\%Y-\%m-\%d`.txt


在使用单引号后,%也可以不用转义

5 3 * * * /bin/touch ~/testfile_`date +'%Y-%m-%d'`.txt


练习:

1、每3分钟执行一个"echo "how are you?";

2、每周2、4、6备份/etc/目录至/backup目录中,备份的文件名以当etc_开头并跟上当日的日期作为文件名;

3、每天6、9、12、15、18查看一下当前系统挂载的所有文件系统,并将查看的结果追加至/tmp/mounts.txt文件中;

4、每天每两小时取当前系统内存空间余量,将其保存至/stats/memory.txt文件中;


crontab文件的格式:

空白行会被忽略

# 开头的行是注释;


1、*/3 * * * * /bin/echo "how are you?"

2、3 2 * * 2,4,6 /bin/tar -Jcf /backup/etc_`date '+%F'`.tar.xz /etc/*

3、17 6,9,12,15,18 * * * /bin/mount >> /tmp/mounts.txt

4、34 */2 * * * /bin/grep "^MemFree:" /proc/meminfo >> /stats/memory.txt


如何实现秒级别的任务:

* * * * * for i in {0..4}; do /bin/echo "how are you?"; sleep 10; done


facl: 文件访问控制列表

facl: 附加原有权限模型之上另一层权限控制机制,保存至文件扩展属性信息中;


getfacl FILE 获取文件的权限信息

setfacl {-x|-m} 权限 FILE 设置文件的权限

-m: 设定权限

-m u:UserName:Perms

-m g:GroupName:Perms

-m m::Perms

-x: 取消权限

-x u:UserName

-x g:GroupName

-x m:


-R: 递归


bash编程之循环控制:

for varName in LIST; do

循环体

done


while CONDITION; do

循环体

done


until CONDITION; do

循环体

done


循环控制:

continue: 提前结束本次循环而开始评估下一轮;

break [n]: 跳出当前循环




练习:提示用户输入用户名,显示用户的ID号;直到用户输入quit退出;

#!/bin/bash

#

if [ $UID -ne 0 ]; then

echo "`basename $0` must be running as root"

exit 1

fi


while true; do

read -p "Enter a user name: " userName

if [ "$userName" == 'quit' ]; then

break

fi


id -u $userName

done



练习:写一个脚本

1、提示用户输入一个目录路径;

2、显示目录下至少包含一个大写字母的文件名;


#!/bin/bash

#

while true; do

read -p "Enter a directory: " dirName

[ "$dirName" == 'quit' ] && exit 3

[ -d "$dirName" ] && break || echo "Wrong directory..."

done



for fileName in $dirName/*; do

if [[ "$fileName" =~ .*[[:upper:]]{1,}.* ]]; then

echo "$fileName"

fi

done


文件 权限 用户 目录 命令 任务 时间 系统 参数 进程 循环 处理 大小 邮件 信息 条件 路径 作业 控制 输入 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 南京欣网互联网络科技 深圳市人人互联网科技有限公司 广州淘业互联网络科技 哈尔滨大商圈互联网科技有限公司 山东特亿宝互联网科技有限公司 互联网科技工作委员会副主任毛军 互联网科技资迅 互联网科技与金融科技 青岛互联网科技公司 菲比寻常互联网科技 盛创互联网科技有限公司 无锡溥仪互联网科技有限公司 互联网大会黑科技排名 厦门千工互联网科技有限公司 民营互联网公司国防科技 黑云互联网科技有限公司 从那以后互联网科技有限公司 广东鹅鹅鹅互联网科技有限公司 全球科技与互联网公司市值变化 中国互联网公司的科技投入 麻工互联网科技 互联网科技与金融科技 赫美联合互联网科技 万达互联网科技 哈尔滨秒房互联网科技有限公司 蓝色互联网科技 新兴科技互联网创新大赛颁奖典礼 科技和互联网行业的特点 北京品多多互联网科技有限公司 互联网科技大会大佬
0