Shell: 解决文件复制后权限变化问题

你遇到的问题是:用 cp 命令复制文件后,文件权限从原来的 755 变成了 750。
原因可能有以下几种:

1. umask 设置影响

umask 是 Linux 下控制新建文件/目录默认权限的机制。
当你用 cp 复制文件时,如果没有加 -p 参数,目标文件的权限会受到当前 shell 的 umask 影响。
比如你的脚本里有 umask 027,这会导致新建文件/目录权限去掉 group 的写权限和 other 的所有权限。

  • 755(rwxr-xr-x)
  • umask 027 会去掉 group 的 w,other 的所有权限
  • 结果就是 750(rwxr-x—)

2. cp 命令参数

  • cp 默认不会保留原文件权限。
  • 如果你想保留原文件的权限、属主、时间戳等信息,应该加 -p 参数:
cp -p 源文件 目标文件

3. 脚本或环境自动修改

你提供的 chmod_file.sh 脚本里有对目录和文件的权限修改(比如 chmod 750 "$dir"),如果你复制后又执行了这个脚本,也会把权限改成 750。


解决方法

  1. 复制时保留权限
    cp -p 复制文件:

    cp -p 源文件 目标文件
    
  2. 检查 umask 设置
    查看当前 shell 的 umask:

    umask
    

    如果是 027,说明新建文件/目录默认权限会比 755 少一些。

  3. 检查脚本是否有 chmod 操作
    如果有自动化脚本(比如你发的 chmod_file.sh),看看里面是否有把权限改成 750 的逻辑。


总结:
你遇到的权限变化,最常见的原因是 umask 设置和 cp 没有加 -p 参数。
建议用 cp -p,并检查是否有脚本自动修改权限。


是的,cp -rfp 是可以的,参数含义如下:

  • -r:递归复制目录及其内容(如果是目录的话必须加)
  • -f:强制覆盖目标文件(如果目标已存在则直接覆盖)
  • -p:保留原文件的权限、时间戳、属主等信息

所以,如果你想递归复制目录,并且保留权限、时间戳等信息,推荐用:

cp -rfp 源路径 目标路径

如果只是复制单个文件,cp -fp 就可以了,不需要 -r


注意:

  • -p 参数是关键,它能保留原有的权限(比如 755),否则会受到 umask 影响。
  • 如果你复制的是目录,必须加 -r

总结:

  • 复制文件并保留权限:cp -fp 源文件 目标文件
  • 递归复制目录并保留权限:cp -rfp 源目录 目标目录
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值