一、文件权限进阶:批量设置目录及子文件权限(递归操作)
之前学了chmod
改单个文件权限,但实际工作中经常需要 “改一个目录里所有文件(包括子目录)的权限”(比如给团队共享目录设置权限)。
1. 先回忆:权限的 “数字表示法”(必记!)
权限分 “读(r=4)、写(w=2)、执行(x=1)”,每个用户组(所有者、所属组、其他人)的权限用 3 个数字表示,比如:
755
:所有者(7=4+2+1:读 + 写 + 执行),所属组和其他人(5=4+1:读 + 执行)—— 适合脚本、目录。644
:所有者(6=4+2:读 + 写),所属组和其他人(4:读)—— 适合普通文件(文档、日志)。
2. 关键:chmod -R
递归修改权限(改目录及所有子内容)
生活场景:你创建了一个share
目录,里面有 10 个文件和 5 个子目录,想让 “所有文件权限都是 644,所有目录权限都是 755”,手动改太麻烦 —— 用-R
(recursive 递归)一键搞定。
实操 1:给linux_study
目录及子文件批量设权限
步骤 1:进入linux_study
目录,先看看当前权限(用ll
,之前设置的别名,等同于ls -l
):
bash
cd ~/linux_study # 进入学习目录
ll # 查看当前文件/目录的权限(记一下现在的权限,方便对比)
步骤 2:递归设置 “所有文件和目录” 的权限为755
(只是练习,实际按需调整):
bash
chmod -R 755 ./ # ./表示“当前目录”,-R表示“递归处理所有子文件和子目录”
步骤 3:验证效果:再次用ll
查看,会发现当前目录下的所有文件、子目录的权限都变成了rwxr-xr-x
(对应 755)。
实操 2:更精细 —— 只改目录权限,不改文件权限(工作常用!)
有时候需要 “目录能进入(执行权限 x),但文件不能随便改”,可以用find
配合chmod
实现(结合第 3 天学的find
命令):
需求:linux_study
目录中,所有 “子目录” 设为 755(能进入、读内容),所有 “普通文件” 设为 644(只能读,不能乱改)。
步骤 1:先找所有子目录,批量设为 755:
bash
find ./ -type d -exec chmod 755 {} \; # -type d 表示“只找目录”
- 解释:
find
找到所有目录后,用-exec
把每个目录({}
)传给chmod 755
处理。
步骤 2:再找所有普通文件,批量设为 644:
bash
find ./ -type f -exec chmod 644 {} \; # -type f 表示“只找普通文件”
验证:用ll
查看,目录权限都是rwxr-xr-x
(755),文件都是rw-r--r--
(644)—— 这是工作中 “共享目录” 的常用权限设置!
3. 为什么要批量设权限?(生活例子)
就像你家有个 “共享储物间”:
- 储物间的门(目录)需要 “能打开(x)、能看里面有什么(r)”—— 对应目录权限 755;
- 储物间里的文件(比如说明书)需要 “能看(r),但不能随便改(w)”—— 对应文件权限 644。
二、Shell 脚本进阶:while 循环(逐行处理文件内容)
之前学了for
循环(比如 “批量创建 10 个文件”),今天学while
循环 —— 它擅长 “逐行读取文件内容并处理”(比如分析日志文件,一行一行找错误)。
1. while 循环的核心用法:读一行,处理一行
命令格式(记这个):
bash
while read 变量名; do
# 对读取的一行内容(变量名)做处理(比如输出、判断)
echo $变量名 # 比如“输出这一行内容”
done < 要读取的文件名 # < 表示“从文件读取内容”
2. 实操 1:逐行读取long_text.txt
并输出(最简单的例子)
步骤 1:确保long_text.txt
有内容(如果没有,先随便写几行,每行一句话):
bash
# 如果文件为空,先添加内容
echo "第一行:Linux权限很重要" >> long_text.txt
echo "第二行:while循环能读文件" >> long_text.txt
echo "第三行:备份数据要定期" >> long_text.txt
步骤 2:创建脚本read_file.sh
,用 while 循环逐行读文件:
bash
nano ~/linux_study/read_file.sh # 打开编辑器
步骤 3:写入以下内容(复制粘贴):
bash
#!/bin/bash
# 脚本功能:逐行读取long_text.txt并输出,加行号
line_num=1 # 定义一个变量,记录行号(从1开始)
# while循环读文件:每次读一行,存到变量line里
while read line; do
echo "第$line_num行:$line" # 输出“行号:内容”
line_num=$((line_num + 1)) # 行号+1($(( )) 表示计算)
done < ~/linux_study/long_text.txt # 从long_text.txt读内容
步骤 4:保存并加执行权限:
- 按
Ctrl+O
→回车(保存);Ctrl+X
(退出)。 - 加权限:
chmod +x read_file.sh
步骤 5:运行脚本,看效果:
bash
./read_file.sh
预期输出(一行一行显示,带行号):
plaintext
第1行:第一行:Linux权限很重要
第2行:第二行:while循环能读文件
第3行:第三行:备份数据要定期
3. 实操 2:逐行读取并筛选内容(比如找含 “错误” 的行)
场景:假设long_text.txt
是日志文件,里面有 “错误” 记录,用 while 循环一行一行找。
步骤 1:先给long_text.txt
加一行带 “错误” 的内容:
bash
echo "第四行:系统错误:无法连接网络" >> long_text.txt
步骤 2:修改read_file.sh
,添加 “筛选含‘错误’的行”:
bash
nano read_file.sh # 打开脚本
修改后内容(在循环里加 if 判断):
bash
#!/bin/bash
line_num=1
while read line; do
echo "第$line_num行:$line"
# 如果当前行包含“错误”,就标红提示(用echo -e加颜色)
if echo "$line" | grep -q "错误"; then # -q 表示“安静模式”,只判断不输出
echo -e "\033[31m注意:这一行有错误!\033[0m" # 31m是红色,0m恢复默认
fi
line_num=$((line_num + 1))
done < ~/linux_study/long_text.txt
步骤 3:运行脚本,会看到 “含错误的行” 下面有红色提示 —— 这就是 “分析日志找错误” 的基础逻辑!
三、系统备份基础:用 tar 命令备份重要文件(防丢数据)
“数据备份” 是工作中 “最重要的习惯”—— 就像你手机里的照片会备份到云端,Linux 里的配置文件、日志、脚本也需要定期备份。
1. 备份的核心命令:tar
(打包 + 压缩,之前学过,今天练 “指定内容备份”)
生活场景:你想把linux_study
目录(你的学习笔记)和/etc
目录(系统配置文件,很重要)备份到/backup
目录,避免误删。
2. 实操 1:手动备份linux_study
到/backup
步骤 1:先创建一个专门放备份的目录/backup
(需要管理员权限,因为/
目录下创建):
bash
sudo mkdir /backup # 创建/backup目录
步骤 2:用tar
打包linux_study
目录,压缩到/backup
,文件名带日期(方便区分版本):
bash
# 格式:tar -zcvf 备份文件路径/文件名-日期.tar.gz 要备份的目录
tar -zcvf /backup/linux_study-$(date +%Y%m%d).tar.gz ~/linux_study
$(date +%Y%m%d)
:自动获取当前日期(比如 20250710),避免备份文件重名;- 执行后会显示 “正在打包哪些文件”,完成后
/backup
目录会有一个.tar.gz
压缩包。
步骤 3:验证备份是否有效(解压缩看看内容对不对):
bash
# 先创建一个临时目录,用来解压测试
mkdir ~/test_backup
# 解压备份文件到临时目录
tar -zxvf /backup/linux_study-20250710.tar.gz -C ~/test_backup # 替换成你的日期
# 查看解压后的内容,和原目录一致就成功了
ls ~/test_backup/home/你的用户名/linux_study
3. 实操 2:备份/etc
目录(系统配置文件,必备份!)
/etc
目录存着系统所有配置(比如网络、用户、服务设置),删错会导致系统故障,必须备份:
bash
sudo tar -zcvf /backup/etc-$(date +%Y%m%d).tar.gz /etc # 需要sudo,因为/etc权限高
4. 为什么要带日期?(生活例子)
就像你手机照片的备份:“20250701 备份” 和 “20250710 备份”—— 如果 7 月 5 日误删了文件,可以恢复到 7 月 1 日的版本,而不是最新的(可能已经丢了)。
今日必练实操清单(跟着做,10 分钟完成)
-
权限批量设置:
- 进入
linux_study
,创建一个子目录test_dir
,里面随便放 2 个文件(touch test_dir/file1.txt test_dir/file2.txt
); - 用
find
命令给test_dir
的子目录设 755,文件设 644(复现今天的步骤)。
- 进入
-
while 循环读文件:
- 在
long_text.txt
里加 2 行带 “成功” 的内容; - 修改
read_file.sh
,让它遇到含 “成功” 的行时,用绿色字提示(参考红色提示的写法,绿色是\033[32m
)。
- 在
-
备份练习:
- 把
read_file.sh
脚本单独备份到/backup
,文件名带日期(tar -zcvf /backup/script-$(date +%Y%m%d).tar.gz ~/linux_study/read_file.sh
)。
- 把
今日总结(3 句话记住核心)
- 批量权限:
find ./ -type d -exec chmod 755 {} \;
(目录 755)和find ./ -type f -exec chmod 644 {} \;
(文件 644)—— 共享目录必用。 - while 循环:
while read line; do ... done < 文件名
—— 逐行处理日志 / 文本的万能公式。 - 简单备份:
tar -zcvf /backup/文件名-$(date +%Y%m%d).tar.gz 要备份的内容
—— 每天花 1 分钟备份,能避免 99% 的 “数据丢失崩溃”。