Sed 在 Windows 中创建不可删除的文件

Posted

技术标签:

【中文标题】Sed 在 Windows 中创建不可删除的文件【英文标题】:Sed creates un-deleteable files in Windows 【发布时间】:2010-12-21 20:52:02 【问题描述】:

我试图在 Windows Server 2003 中运行以下命令,但 sed 会创建一堆文件,我无法从当前目录中的命令行删除这些文件。

for /R %f in (*.*) do "C:\Program Files\gnuwin32\bin\sed.exe" -i "s/bad/good/g" "%f"

有人有什么建议吗?神奇的是,我可以使用 Windows 资源管理器删除文件。

根据要求,以下是一些示例文件名:

sed0E3WZJ sed5miXwt sed6fzFKh

还有更多故障排除信息...

命令提示符和批处理文件都会出现这种情况 如果我只需要在单个目录上运行 sed,那么我使用 sed "s/bad/good/g" *.* 并且一切正常。唉,我还需要它来处理所有子目录。 我只安装了 Sed。 Sed 正在创建文件

【问题讨论】:

如果您显示一个示例文件名会有所帮助。我用“c:\cygwin\bin\sed.exe”尝试了你的命令,除了关于反斜杠与斜杠的警告之外,它运行良好。 sed -i 如果文件一开始不是只读的,那么对我来说实际上效果很好。没有不可删除的临时文件剩余,也没有错误。我应该提到我将它与 find 结合使用,而不是在 for 循环中。 【参考方案1】:

你可以在没有 for 循环的情况下运行 sed

c:\test> sed -i.bak "s/bad/good/g" file*.*

【讨论】:

刚刚在名为“Test”的文件夹中尝试过(减去“文件”),子目录名为“New Folder”,我收到以下错误:C:\Documents and Settings\zchoy\Desktop \Test>"C:\Program Files\gnuwin32\bin\sed.exe" -i.bak "s/bad/good/g" . sed.exe: 无法读取新文件夹:权限被拒绝我也得到了一个垃圾文件:sed3aQhvO【参考方案2】:

Cygwin 有时会在文件上使用 ACL,您可能必须使用 cacls 或 chmod 修复它,然后才能删除文件。

【讨论】:

很遗憾,我没有安装 Cygwin。 @Zian cacls 是一个内置的 Windows 应用程序,xcacls(新的“cacls”)也是如此。另外,我应该提到 GnuWin32 的 sed 很可能也有这个问题【参考方案3】:

这里是一些故障排除的地方。当您从命令行批处理文件运行该命令时,会发生这种情况吗?如果您在命令行上对单个文件运行 sed 会怎样——它是为每个文件创建这些文件,还是只为某些文件/文件类型创建这些文件?它仅发生在该替换中,还是所有替换中,还是仅在您对文件运行 sed.exe 时发生?是只 sed 创建这些文件,还是所有 Gnuwin32 exe(例如 awk、cat 等)?来自新安装的 Gnuwin32 的 sed.exe 是否会发生同样的事情?当您尝试删除文件时,它会给出什么错误消息?您可以在命令提示符仍然打开时从资源管理器中删除文件吗?如果您关闭命令提示符并重新打开它,然后尝试删除文件怎么办?

【讨论】:

【参考方案4】:

这是在黑暗中的一次尝试,但如果 sed 的 gnuwin32 实现是 duff (即,在某些方面有问题),我一点也不感到惊讶。您可以尝试使用 Windows 的 AT&T U/Win POSIX 支持来复制问题吗?它易于安装,包括 Korn shell、sedfind,因此您可以使用 find 代替 FOR /R。 (我想知道部分问题是否在于 MS FOR 和 gnuwin32 sed 不能很好地配合使用。)

【讨论】:

【参考方案5】:

我已经复制了你的设置,我有以下观察结果。

    我认为循环中没有问题。简单的命令 "C:\Program Files\gnuwin32\bin\sed.exe" -i "s/bad/good/g" . - 创建相同的临时文件集。 这些文件确实是由 sed 创建的。 sed 在“就地” (-i) 选项打开时创建这些临时文件。在正常过程中,sed 实际上使用调用“unlink”库来删除文件(这就是 cygwin 中发生的事情)。在 gnuwin32 的情况下,“取消链接”似乎失败了。我一直无法弄清楚为什么。我猜测 unlink 调用可能依赖于 gnuwin32 'coreutils' 库,并尝试下载并安装 coreutils 库 - 没有骰子。 如果在执行 sed 命令之前删除父文件夹中的“只读”限制,则可以从 Windows 命令提示符中删除临时文件。所以这应该会给你一些暂时的喘息机会。

我认为我们现在有足够的信息来提交错误报告。如果您同意,我认为将其告知负责 gnuwin32 的好人并寻求帮助可能是个好主意。

同时,以下版本会清理其临时文件:

https://github.com/mbuilov/sed-windows

【讨论】:

这是一个已知的错误 (sourceforge.net/projects/gnuwin32/forums/forum/74807/topic/…)。我已经提交了错误报告,但我不抱希望 (sourceforge.net/tracker/…)。【参考方案6】:

由于这是带有 -i 选项的 sed 中的一个已知错误,您可以运行 attrib -R <filename> 以在 sed 完成后从文件中删除只读属性。

或者不要使用 -i 选项并将输出重定向到新文件,然后删除并重命名输入和输出。

【讨论】:

或者在运行“sed -i”之前运行attrib -R 【参考方案7】:

我意识到这是一个旧线程,但它仍然是一个问题。我的解决方法是添加 "DEL sed*" 到 sed 之后的批处理文件的末尾。又快又脏。

【讨论】:

我想到了,不幸的是,这个创可贴对我不起作用,原因有两个: 1. 我的项目中有文件名以 sed 开头。 2. 任何从事我项目的开发人员都可以添加名称以 sed 开头的其他文件。【参考方案8】:

我正在使用这个命令来清理gnuwin32's sed创建的临时文件:

FOR /f "tokens=*" %%a in ('dir /b ^| findstr /i "^sed[0-9a-zA-Z][0-9a-zA-Z][0-9a-zA-Z][0-9a-zA-Z][0-9a-zA-Z][0-9a-zA-Z]$"') DO del %%a

【讨论】:

【参考方案9】:

我知道这是旧的。但只是想与人们分享我的所作所为。

实际上是通过 gvim 示例 .swap 文件打开的文件的临时文件导致 sed tmp 文件没有被完全删除。

所以 sed 试图读取并附加到用户当前正在查看的打开文件中,但在执行此操作时遇到了问题,导致 tmp 文件错误。

【讨论】:

以上是关于Sed 在 Windows 中创建不可删除的文件的主要内容,如果未能解决你的问题,请参考以下文章

在Windows中创建一个其他用户无法访问的文件

如何在 Ruby 中创建文件

如何在 Windows 10 中创建 .gitignore 文件 [重复]

如何在 Windows/Mac/Linux 中创建隐藏文件?

使 SaveFileDialog 不在用户选择的目录中创建测试文件

在 Windows 中创建 Cookie 文件 RabbitMQ 失败