当前位置: 首页 > news >正文

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 1027 08:54 dir1
drwx------ 2 root root 6 1027 08:55 dir2
drwx------ 2 root root 6 1027 08:55 dir3
-rw-r--r-- 1 root root 0 1027 08:56 file1
-rwxr-xr-x 1 root root 0 1027 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 1027 08:54 dir1
drwxr-xr-x 2 www root 6 1027 08:55 dir2
drwxr-xr-x 2 www root 6 1027 08:55 dir3
-rw-r--r-- 1 www root 0 1027 08:56 file1
-rw-r--r-- 1 www root 0 1027 08:56 file2

总结

stat -c %格式化符号 文件名

这些格式序列是 stat 命令用于自定义输出格式时所使用的。你可以通过 -c 选项来指定这些格式序列,从而以特定的方式显示文件或文件系统的状态信息。以下是对这些格式序列的详细解释,分为文件部分和文件系统部分。

文件部分的格式序列

  • %a:以十进制表示的权限位
  • %A:以人类可读的形式显示的权限位和文件类型(例如 -rw-r--r--drwxr-xr-x)。
  • %b:已分配的块数(参考 %B)。
  • %B%b 所报告的每个块的大小(以字节为单位)。
  • %CSELinux 安全上下文字符串。
  • %d:以十进制表示的设备号。
  • %D:以十六进制表示的设备号。
  • %f:原始模式(以十六进制表示)。
  • %F文件类型(例如 regular filedirectorysymbolic 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 1027 08:54 dir1
drwxr-xr-x 2 www root 6 1027 08:55 dir2
drwxr-xr-x 2 www root 6 1027 08:55 dir3
-rw-r--r-- 1 www root 0 1027 08:56 file1
-rw-r--r-- 1 www root 0 1027 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' ]]

http://www.mrgr.cn/news/59962.html

相关文章:

  • Spring Boot Druid 数据库连接池入门
  • Android 13 SystemUI 隐藏下拉快捷面板部分模块(wifi,bt,nfc等)入口
  • Vue3实现获取验证码按钮倒计时效果
  • Flink Rest API
  • 二十三种设计模式之命令模式
  • 爬虫——scrapy的基本使用
  • GitHub 上传项目保姆级教程
  • 【C++单调栈 贡献法】907. 子数组的最小值之和|1975
  • python基于django线上视频学习系统设计与实现_j0189d4x
  • 【Linux系统编程】——Linux入门指南:从零开始掌握操作系统的核心(指令篇)
  • 基于SpringBoot的中药材进存销管理系统设计与实现
  • 在浏览器中运行 Puppeteer:解锁新能力
  • React 中组件通信的几种主要方式
  • Python实现摇号系统
  • 还没想好说什么
  • Linux:指令再认识
  • 【在WindoWs 10 cmd查询管理目录下所有文件及其相对位置】
  • C语言基础题(大合集2)
  • 重学SpringBoot3-Spring WebFlux之SSE服务器发送事件
  • Rust中常用的命令工具
  • 存储期类别
  • Autosar 启动过程-基于ETAS工具
  • StringBuilder——练习
  • Java | ReentrantLock 锁和 synchronized 锁的区别和共同特点是什么?
  • redis详细教程(2.List教程)
  • IllegalMonitorStateException:Illegal Monitor Operation 完美解决方法 ⚙️