shell脚本每日一练4
华子目录
- 题目
- 环境准备
- 脚本编写
- 测试
- 总结
- `stat -c %格式化符号 文件名`
- 文件部分的格式序列
- 常用示例
- `&&`在两条命令中间,可以起到`if`判断的作用
- `find .`
- `字符串`判断,结合`!=`和`==`
题目
- 检查
/data/wwwroot/app目录下所有文本文件和目录,看是否满足下面条件:- 所有
文本文件权限为644 - 所有
目录权限为755 文本文件和目录所有者为www,所属组为root
- 所有
- 如果
不满足,改为符合要求(注意:不要直接改权限,一定要有判断的过程)
环境准备
[root@shell shell]# mkdir -p /data/wwwroot/app/[root@shell shell]# useradd www
[root@shell shell]# echo 123 | passwd --stdin www
更改用户 www 的密码 。
passwd:所有的身份验证令牌已经成功更新。[root@shell shell]# cd /data/wwwroot/app/
[root@shell app]# ll
总用量 0
drwxr-xr-x 2 root root 6 10月 27 08:54 dir1
drwx------ 2 root root 6 10月 27 08:55 dir2
drwx------ 2 root root 6 10月 27 08:55 dir3
-rw-r--r-- 1 root root 0 10月 27 08:56 file1
-rwxr-xr-x 1 root root 0 10月 27 08:56 file2
脚本编写
[root@shell shell]# cat shell4.sh
#!/bin/bash
cd /data/wwwroot/app
for f in `find .`
dof_p=`stat -c %a $f` #获取文件权限f_u=`stat -c %U $f` #获取文件所属者f_g=`stat -c %G $f` #获取文件所属组if [ -d $f ] #作文件测试,判断是否是目录文件then[ $f_p != '755' ] && chmod 755 $f #[]和[[]]都可以else #如果不是目录文件,则是文本文件[ $f_p != '644' ] && chmod 644 $f #[]和[[]]都可以fi[ $f_u != 'www' ] && chown www $f #[]和[[]]都可以[ $f_u != 'root' ] && chown :root $f #[]和[[]]都可以
done
测试
[root@shell shell]# bash shell4.sh
[root@shell shell]# cd /data/wwwroot/app/
[root@shell app]# ll
总用量 0
drwxr-xr-x 2 www root 6 10月 27 08:54 dir1
drwxr-xr-x 2 www root 6 10月 27 08:55 dir2
drwxr-xr-x 2 www root 6 10月 27 08:55 dir3
-rw-r--r-- 1 www root 0 10月 27 08:56 file1
-rw-r--r-- 1 www root 0 10月 27 08:56 file2
总结
stat -c %格式化符号 文件名
这些格式序列是 stat 命令用于自定义输出格式时所使用的。你可以通过 -c 选项来指定这些格式序列,从而以特定的方式显示文件或文件系统的状态信息。以下是对这些格式序列的详细解释,分为文件部分和文件系统部分。
文件部分的格式序列
%a:以十进制表示的权限位%A:以人类可读的形式显示的权限位和文件类型(例如-rw-r--r--或drwxr-xr-x)。%b:已分配的块数(参考%B)。%B:%b所报告的每个块的大小(以字节为单位)。%C:SELinux安全上下文字符串。%d:以十进制表示的设备号。%D:以十六进制表示的设备号。%f:原始模式(以十六进制表示)。%F:文件类型(例如regular file、directory、symbolic link等)。%g:文件所属组的组ID。%G:文件所属组。%h:硬链接的数量。%i:inode 号。%m:挂载点(如果文件是挂载点的一部分)。%n:文件名。%N:带引用的文件名(如果文件是符号链接,则显示链接指向的文件名)。%o:优化的 I/O 传输大小提示。%s:文件总大小(以字节为单位)。%t:对于字符/块设备特殊文件,主要设备类型(以十六进制表示)。%T:对于字符/块设备特殊文件,次要设备类型(以十六进制表示)。%u:文件所属者的用户ID。%U:文件所属者。%w:文件的创建时间(人类可读格式);如果未知,则显示-。%W:文件的创建时间(自 Epoch 起的秒数);如果未知,则为0。%x:上次访问时间(人类可读格式)。%X:上次访问时间(自 Epoch 起的秒数)。%y:上次数据修改时间(人类可读格式)。%Y:上次数据修改时间(自 Epoch 起的秒数)。%z:上次状态更改时间(人类可读格式)。%Z:上次状态更改时间(自 Epoch 起的秒数)。
常用示例
[root@shell app]# ll
总用量 0
drwxr-xr-x 2 www root 6 10月 27 08:54 dir1
drwxr-xr-x 2 www root 6 10月 27 08:55 dir2
drwxr-xr-x 2 www root 6 10月 27 08:55 dir3
-rw-r--r-- 1 www root 0 10月 27 08:56 file1
-rw-r--r-- 1 www root 0 10月 27 08:56 file2
- 获取
文件权限
[root@shell app]# stat -c %a dir1
755
- 获取
文件权限
[root@shell app]# stat -c %A dir1
drwxr-xr-x
- 获取文件
所属者id
[root@shell app]# stat -c %u dir1
1001
- 获取文件
所属者
[root@shell app]# stat -c %U dir1
www
- 获取文件
所属组id
[root@shell app]# stat -c %g dir1
0
- 获取文件
所属组
[root@shell app]# stat -c %G dir1
root
- 获取
文件名
[root@shell app]# stat -c %n dir1
dir1
- 获取
文件类型
[root@shell app]# stat -c %F dir1
目录
[root@shell app]# stat -c %F file1
普通空文件[root@shell app]# echo huazi > file1
[root@shell app]# stat -c %F file1
普通文件
- 获取
文件大小(以字节为单位)
[root@shell app]# stat -c %s file1
6[root@shell app]# vim file1 #添加数据
huazigasgasg
fsagsagfdsagsag
agsag
gaag[root@shell app]# stat -c %s file1
45
&&在两条命令中间,可以起到if判断的作用
if [ -d $f ]
then[ $f_p != '755' ] && chmod 755 $f #[]和[[]]都可以
else[ $f_p != '644' ] && chmod 644 $f #[]和[[]]都可以
fi
find .
find .会遍历当前目录下的所有目录文件,包括子目录
字符串判断,结合!=和==
- 使用
[]和[[]]都是可以的
[ $f_p != '755' ][[ $f_p != '755' ]]
