You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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)"

关键原理说明

  1. 获取权限:

    • Linux下用stat -c "%a"直接获取文件的三位八进制权限(如644)。
    • macOS下用stat -f "%o"获取相同格式的八进制权限。
  2. 按位异或反转组权限:
    八进制的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,符合你的第二个例子。

使用方法

  1. 将脚本保存为reverse-group-perm.sh。
  2. 赋予执行权限:chmod +x reverse-group-perm.sh。
  3. 运行脚本并传入目标文件名:./reverse-group-perm.sh file.txt。

内容的提问来源于stack exchange,提问作者Glyniel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 08:18:34