繁体   English   中英

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

[英]Sed creates un-deleteable files in Windows

我正在尝试在 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 正在创建文件

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

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

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

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

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

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

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

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

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

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

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

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

我正在使用此命令来清理由gnuwin32 的 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

我知道这是旧的。 但只是想与人们分享我所做的导致这种情况的事情。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM