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' ]]