如何在Bash中直接捕获文件权限并通过chmod重新应用?
解决sed -i修改文件后丢失执行权限的问题
直接用stat命令就能获取文件权限的原生格式,不用折腾ls -l的输出,步骤很简单:
通用GNU/Linux方案
- 先存好目标文件的权限:
PERM=$(stat -c "%a" your_script.sh)
%a参数会直接返回八进制权限值(比如755、700),刚好是chmod能直接用的格式。
- 执行你的sed修改:
sed -i 's/old_content/new_content/g' your_script.sh
- 把权限改回去:
chmod $PERM your_script.sh
嫌麻烦可以合并成一行:
PERM=$(stat -c "%a" your_script.sh); sed -i 's/old_content/new_content/g' your_script.sh; chmod $PERM your_script.sh
适配BSD/macOS的情况
BSD系的stat参数不一样,要这么取权限:
# 截取八进制权限的后三位(因为BSD stat返回的完整模式包含文件类型位) PERM=$(stat -f "%p" your_script.sh | cut -c 4-6) sed -i '' 's/old_content/new_content/g' your_script.sh # macOS的sed -i需要加空参数 chmod $PERM your_script.sh
另一种直观方式:用符号权限
不想记数值的话,也可以直接存符号格式的权限(比如rwxr-xr-x):
# GNU/Linux PERM=$(stat -c "%A" your_script.sh) chmod "$PERM" your_script.sh # BSD/macOS PERM=$(stat -f "%Lp" your_script.sh) chmod "$PERM" your_script.sh
内容的提问来源于stack exchange,提问作者Carl Ponder
相关产品推荐
相关产品推荐

