当我使用 sed 命令在 cygwin bash 中更改文件时,该文件被锁定。
复制:
- 打开
cmd
并cd
非用户目录(Fetemp
) echo aaa > test.txt
- 在文本编辑器中打开,添加行,尝试保存 => 有效
%CYGWIN_HOME%\bin\bash -c "sed -i 's/aaa/bbb/' test.txt
“- 在文本编辑器中,添加另一行并尝试保存 => “访问被拒绝”
什么鬼?!我怎样才能在不锁定的情况下 sed 一个文件,或者随后释放文件句柄?
Windows 安全权限似乎已完全被文件破坏:
之前的权限:
之后的权限:
但它在用户目录中有效(
Desktop
)- 我使用 LockHunter 检查了文件,但似乎没有进程锁定文件
- Cygwin 常见问题解答提到了对某些程序的干扰。它尝试卸载 Antivir 和 Catalyst 并重新启动。
- 尝试
UnxTools(崩溃)、GnuWin32(sed 不支持就地替换)、Interex(安装程序不支持 W7 Pro)... * 叹息 *
答案1
对应于Cygwin 邮件列表, 使用诺阿克用于安装
$ mount -o binary,posix=0,user,noacl C:/tmp /mnt/tmp
../cygwin/fstab
或者在启动 Cygwin bash 之前直接在 Windows 中
C:/tmp /mnt/tmp ntfs binary,posix=0,user,noacl 0 0
答案2
在 cygwin 下使用 find 结合 grep 和 sed 自动处理一个装满 Java 源代码文件的文件夹后,我遇到了完全相同的问题。Sed 弄乱了我文件的 NTFS 文件权限,重启后仍然存在,所以我搜索了一种简单的方法来解决这个问题。
我实际上找到了一种将文件权限恢复为旧值的简单方法。它可以对整个文件夹进行递归操作,这对我很重要,因为我一次修改了很多文件(几百个)。遗憾的是,我只知道菜单项的德语名称,所以我不确定菜单项(在 Windows 资源管理器中)的正确英文名称。
在德语中,您可以这样做:右键单击我使用 sed 的文件夹的父文件夹,“Eigenschaften”(上下文菜单)、“Sicherheit”(对话框中的选项卡)、“Erweitert”(按钮)、“Berechtigungen ändern...”(带有 UAC 提示的按钮),现在我只需选中两个复选框(上面的复选框已经设置,下面的复选框尚未设置,但必须设置)。现在我单击“确定”三次。
这样做的实际变化是,下方的复选框强制 Windows 用您右键单击的文件夹的权限递归替换文件夹内容的当前权限,因此所有损坏的权限都已修复。对我来说,这非常有效,而且速度也非常快(对于许多文件,只需几秒钟)。
可能的翻译(我猜的):
- “个人身份” -> “属性”
- “安全” -> “安全”
- “扩展” -> “高级”
- “更改权限...” -> “更改权限...”
答案3
我运行了自己的一系列测试,事实上,在 sed 命令之后,文件的权限确实设置为 r-xr-x--- ,后续的 cygwin 命令会将其视为只读文件。
C:\Temp>echo aaa > test.txt
C:\Temp>ls -l
total 1
----------+ 1 bikeguy ???????? 6 Feb 21 08:51 test.txt
C:\temp>sed -i 's/aaa/bbb/' test.txt
C:\temp>cat test.txt
bbb
C:\temp>ls -l test.txt
-r-xr-x---+ 1 bikeguy mkgroup-l-d 5 Feb 21 08:52 test.txt
C:\temp>
这些 -r-xr-x--- 权限确实会阻止某些软件的后续写入:
C:\temp>echo xxx > test.txt
Access is denied.
C:\temp>
因此,解决方法是在文件上添加额外的 chmod
C:\temp>chmod 777 test.txt
C:\temp>echo xxx > test.txt
C:\temp>