文件查找: find命令
grep : 文本搜索
find :文本查找
locate:(updatedb 手动生产)
1.依赖于数据库
2.非实时查找,结果非精确
3.查找速度快
4.采用的模糊查找
find:
实时查找:速度慢
精确匹配
格式:
find [options] [查找路径] [查找条件] [处理动作]
查找路径:默认为当前目录
查找条件:默认为查找指定路径下的所有文件
处理动作:默认为显示
查找条件:
-name “文件名称”:支持使用globbing(文件通配)
-iname "文件名称" : 根据姓名查找文件,不区分大小写
-user UserName :根据属主查找
-group GroupName : 根据属组查找
-nouser:查找没有属主的文件
-nogroup: 查找没有属组的文件
-type: 根据文件类型查找
f: 普通文件
d: 目录
b: 块设备
c: 字符设备
l: 符号链接文件
p: 命令管道
s: 套节子
-szie:根据文件大小查找
格式: -size[+|-]#Unit
#:(#-1)<x<=#
例: -size +2MB 大于2兆的
-size -2MB 小于2兆的
-size 2MB 等于2兆的
根据时间撮查找:
以天为单位(time):
-atime [+|-]#
-mtime
-ctime
-: 刚好#
+: >#
以分钟为单位
-amin
-mmin
-cmin
根据权限查找:
-perm [+|-] MODE
MODE : 精确匹配
+ MODE:任何一类用户的任何一位权限匹配 (常用于查找某类的某特定权限是否存在)
- MODE:每类用户的指定要检查的权限位都匹配
文件通配:
*:表示任意长度的任意字符
?:表示任意的单个字符
[] : 表示在指定范围内的单个字符:[a-z]
[^]:脱字符,取反的意思
组合条件:
-a :与。同事满足
-o : 或,一个满足
-not , !非。取反
练习:
1.查找/var目录中属主为root且属组为mail的文件
find /var/ -user root -group mail
2.查找/usr目录下不属于root、bin或 hadoop的所有文件
find /usr/ -not -user root -not -user bin -not -user hadoop
find /usr/ -not \( -user root -o -user bin -o -user hadoop \)
3.查找/etc目录中最近一周内其内容修改过的,且不属于root或hadooop的文件
find /etc -mtime -7 -not -user root -not -user hadoop
4.查找当前系统上没有属组或属组,且最近一个月内被访问过的文件
find / \(-nouser -o -nogroup\) -atime -30
5.查找早/etc/目录下大于1M且类型为普通文件的所有文件
find /etc/ -type f -size +1M
6.查找/etc/目录所有用户都没有写权限的文件
find /etc/ -not -perm +222
所有都没有;相反:任何一个有
所有都有:相反:只要有一个没有
7.查找/etc/目录下至少一类没有写权限的文件
find /etc/ -perm -222
8.查找/etc/init.d目录下,所有用户都有执行权限其其他用户有写权限的文件
find /etc/init.d/ -perm -111 -perm -002
find /etc/init.d/ -perm -113
Linux任务计划
一次性任务执行:
at:
1.交互式 让用户在at>提示符输入多个要执行命令
格式:at time
atq =at -L 查看作业
-q 字母 TIme 添加别的队列
at -d job_name 删除一个尚未执行的作业= atrm
Ctrl+d :提价任务
at 作业有队列:使用单个字符表示
2.批处理:将任务的各命令写入文件由at进行调用
at批模式:
at -f 文件路径 TIME
TIME:
模糊时间:
now
noon(中午)
midnight(午夜)
teatime(下午4点)
tomorrow
任务的执行结果会议邮件的形式发送给提交者
使用mail
-s 指定主题
mail -s 主题 用户
mail 用户名
主题
内容
可以通过系统文件当作内容 或者用ehco
echo -e "hello are you " | mail -s "to" root
cat /etc/passwd | mail -s "ss" root
batch:不能指定时间,它自动选择系统空闲时执行
crond:守护进程,运行在后台,随时监视着进程等待执行
服务进程:阻塞,轮训
周期性任务执行
系统cron:
文件: /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. /# :表示在指定时间范围内每隔#一次 5-45/3 5到45分钟,每3分钟执行一次
注意: 通过输出重定向而拒收邮件
&> /dev/null 错误
> /dev/null 2>/文件位置 成功的到/dev/null 成功到指定位置
用户cron:
文件: /var/spool/sron/UserName
使用crontab命令来实现
-l:查看自己的cron任务列表
-e:通过EDITOR变量中定义的编辑器打开用户自己的cron配置文件:
编辑单独的任务都使用-e选项,无论是删除、修改还是新建
-r:移除crontab文件
如果是管理员
-u UserName: 为别的用户指定crontab作业
#crontab -e -u 用户名
提醒:如果在conrtab的用户命令中使用%,得转义为\%
anacron
练习
1、每3分钟执行一个“echo “how are you?””
*/3 * * * * /bin/echo "hao are you"
2、每周2、4、6备份/etc/目录至/backup目录中,备份的文件名以当etc_开头并跟上当日的日期作为文件名
3 2 * * 2,4,6 /bin/tar -Jcf /backup/etc_`data ‘+/%F‘.tar.xz ` /etc/*
3.每天6,9,12,15,18查看一下系统当前挂载的所有文件系统,并将查看的结果追加至/tmp/mounts.txt文件中
3 6,9,12,15,18 * * * * * /bin/mount>>/tmp/mounts.txt
4.每天每两小时取当前系统内存空间余量,将其保存至/stats/memory.txt文件中
34 */2 * * * /bin/grep "^MemFree:" /proc/meminfo >> /status/memory.txt
如何实现秒级别的任务
* * * * * * /bin/echo "how are your"; sleep 30; /bin/echo "how are you"
crontab文件的格式
空白行会被忽略
#开头的行是注释
anacron:
1. 是crontab的补充,用于检查crontab中某任务在过去的一个周期内是否没有执行,
2. 如果没有执行,则在开机以后的某时间点让其执行一次,无论其周期是否到达
facl:文件访问控制列表
普通用户无法安全地将某文件授权给其他用户访问
facl:
附加原有权限模型之上另一层权限控制机制,保存至文件扩展属性信息中
命令:
getfacel file...
setfacel {-x|-m} 权限 file...
-m:设定权限
-m u:UserName:Perms
-m g:GroupName:Perms
-m m::Perms
-x:取消权限
-x u:UserName
-x g:GroupName
-x m:
ll表示为+,有额外的权限属性
-R:递归,对文件夹内的文件也生效
bash编程之循环控制
for varName in List; do
循环体
done
while CONDITION; do
循环体
done
循环控制
continue:提前结束本次循环而开始评估下一轮
break [n]:结束当前循环,指定条吹几次循环
shell练习
练习:求100以内所有偶数之和
#!/bin/bash
declare -i sum=0
declare -i i=1
while [ $i -le 100 ];do
if [ [ $i%2 ] -eq 0 ];then
let sum+=$i
fi
let i++
done
写一个脚本
1.让用户输入一个块设备,如果设备文件不存在,就提示用户重新输入,知道用户输入正确
2.用户可以输入quit退出
#!/bin/bash
#
while true; do
read -p "Enter a dev " devdir
if [ "$devdir" == "quit" ];then
break
fi
if [ -b $devdir ];then
break
else
echo "wrong device file"
fi
done
扩展前一题
1,显示用户输入块设备,并提示用户,后续操作会损坏设备上的所有文件,让用户选择是否选择
2.如果用户输入y。则继续后面的操作
3.如果用户输入n ,则显示用户选择了终止,并退出脚本
4.输入任何其他字符,则用户重新选择
#!/bin/bash
#
while true; do
read -p "Enter a dev " devdir
if [ "$devdir" == "quit" ];then
break
fi
if [ -b $devdir ];then
echo "$devdir is very good !"
read -p "Are you suer [y|b]" devop
devop=echo $devop | tr ‘A-Z‘ ‘a-z‘
if [[ "$devop" == "y" ]];then
echo "no xuanze le yes"
elif [[ "$devop" == "n" ]];then
break
else
continue
fi
else
echo "wrong device file"
fi
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
练习:写一个脚本
前提:配置好yum源
1、如果本机没有一个可用的yum源,则提示用户,并退出脚本(4);如果此脚本非以root用户执行,则显示仅有root才有权限安装程序包,而后退出(3);
2、提示用户输入一个程序包名称,而后使用yum自动安装之;尽可能不输出yum命令执行中的信息;
如果安装成功,则绿色显示,否则,红色显示失败;
3、如果用户输入的程序包不存在,则显示错误后让用户继续输入;
4、如果用户输入quit,则正常退出(0);
5、正常退出前,显示本地共安装的程序包的个数;
#!/bin/bash
while true;do
if [ $UID -ne 0 ]; then
echo "`basename $0` must be running as root"
exit 3
fi
yum repolist &> /dev/null
if [[ $? -eq 0 ]];then
while true;do
read -p "Enter a chengxubao: " baoname
if [[ "$baoname" == "quit" ]];then
rpm -qa |wc -l
exit 0
fi
yum list |grep "^$baoname.*" &> /dev/null
if [[ $? -eq 0 ]];then
yum install $baoname -y &> /dev/null
if [[ $? -ne 0 ]];then
echo "$baoname not ok"
else
echo "$baoname is ok!"
exit 0
fi
else
continue
fi
done
else
echo "yum is not ok!!"
exit 4
fi
done