如何在Bash中反转指定文件的组权限?
反转文件组权限的Bash实现
要实现反转指定文件的组权限(即组的读、写、执行权限位各自取反:有则变无,无则变有),可以利用八进制权限的按位异或操作来完成,这和你在Python中用^的思路一致。下面是完整的脚本实现及解释:
完整脚本
#!/bin/bash # 检查命令行参数数量 if [ $# -ne 1 ]; then echo "用法: $0 <文件名>" exit 1 fi filename="$1" # 检查目标是否为普通文件 if [ ! -f "$filename" ]; then echo "错误: '$filename' 不是普通文件或不存在" exit 1 fi # 获取当前文件的八进制权限 # Linux 环境使用此命令 current_perm=$(stat -c "%a" "$filename") # macOS 环境替换为下面的命令 # current_perm=$(stat -f "%o" "$filename") # 保存原权限的符号和八进制形式 original_sym=$(stat -c "%A" "$filename") original_oct=$current_perm # 计算反转组权限后的八进制值:与八进制070按位异或 # 070对应组权限的读、写、执行位全为1,异或后实现每一位反转 new_perm=$(( 8#$original_oct ^ 8#070 )) # 应用新权限 chmod "$new_perm" "$filename" # 输出结果 echo "文件 '$filename' 组权限已反转:" echo "原权限: $original_sym ($original_oct)" echo "新权限: $(stat -c "%A" "$filename") ($new_perm)"
关键原理说明
获取权限:
- Linux下用
stat -c "%a"直接获取文件的三位八进制权限(如644)。 - macOS下用
stat -f "%o"获取相同格式的八进制权限。
- Linux下用
按位异或反转组权限:
八进制的070对应二进制000111000,正好覆盖组权限的三个位(读、写、执行)。将当前权限与070执行按位异或(^)操作后:- 原权限位为
1(有权限)会变为0(无权限) - 原权限位为
0(无权限)会变为1(有权限)
完美实现组权限的反转需求。
- 原权限位为
验证示例
- 原权限
-rw-r--r--(八进制644):与070异或后得到634,对应符号权限-rw--wxr--,符合你的第一个例子。 - 原权限
-rw--w-r-x(八进制625):与070异或后得到655,对应符号权限-rw-r-xr-x,符合你的第二个例子。
使用方法
- 将脚本保存为
reverse-group-perm.sh。 - 赋予执行权限:
chmod +x reverse-group-perm.sh。 - 运行脚本并传入目标文件名:
./reverse-group-perm.sh file.txt。
内容的提问来源于stack exchange,提问作者Glyniel
相关产品推荐
相关产品推荐

