Cygwin bash sed 锁定我的文件

Cygwin bash sed 锁定我的文件

当我使用 sed 命令在 cygwin bash 中更改文件时,该文件被锁定。

复制:

  1. 打开cmdcd非用户目录(Fe temp
  2. echo aaa > test.txt
  3. 在文本编辑器中打开,添加行,尝试保存 => 有效
  4. %CYGWIN_HOME%\bin\bash -c "sed -i 's/aaa/bbb/' test.txt
  5. 在文本编辑器中,添加另一行并尝试保存 => “访问被拒绝”

什么鬼?!我怎样才能在不锁定的情况下 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>

相关内容