[英]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 资源管理器删除这些文件。
根据要求,以下是一些示例文件名:
而且,更多故障排除信息...
sed "s/bad/good/g" *.*
一切正常。 唉,我还需要它来处理所有子目录。我已经复制了你的设置,我有以下观察结果。
我认为我们现在有足够的信息来提出错误报告。 如果您同意,我认为将其告知负责 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(即在某些方面有问题),我至少不会感到惊讶。 您可以尝试使用对Windows的AT&T U/Win POSIX 支持来复制问题吗? 它易于安装并包含 Korn shell、 sed
和find
,因此您可以使用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.