代码之家  ›  专栏  ›  技术社区  ›  Zian Choy

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

  •  18
  • Zian Choy  · 技术社区  · 16 年前

    我正试图在WindowsServer2003中运行以下命令,但是SED创建了一堆文件,我无法从当前目录中的命令行中删除这些文件。

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

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

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

    • SED0E3WZJ
    • SED5混合波
    • SED6FZFKH

    还有,更多疑难解答信息…

    • 它同时出现在命令提示符和批处理文件中
    • 如果我只需要在一个目录上运行sed,那么我使用 sed "s/bad/good/g" *.* 一切都好。唉,我也需要它来处理所有的子目录。
    • 我只安装了SED。
    • Sed正在创建文件
    8 回复  |  直到 8 年前
        1
  •  21
  •   Dave Jarvis James Eichele    8 年前

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

    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的好人注意并向他们寻求帮助可能是个好主意。

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

        2
  •  3
  •   darrenmc    11 年前

    因为这是SED中的一个已知bug,使用-i选项可以运行 attrib -R <filename> 在SED完成后从文件中删除只读属性。

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

        3
  •  1
  •   Ana Betts    16 年前

    Cygwin有时会对文件使用acl,在删除文件之前,您可能需要使用cacls或chmod来修复它。

        4
  •  1
  •   BlueRaja - Danny Pflughoeft    16 年前

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

        5
  •  0
  •   ghostdog74    16 年前

    你可以不带for循环运行sed

    c:\test> sed -i.bak "s/bad/good/g" file*.*
    
        6
  •  0
  •   Norman Ramsey    16 年前

    这是在黑暗中的一次尝试,但如果GNUWIN32的实现 sed 是否有缺陷(即在某种程度上有缺陷)。你能用 AT&T U/Win 对Windows的POSIX支持?它易于安装,包括Korn外壳, 塞德 ,和 find ,以便使用 找到 而不是 FOR /R . (我想知道问题的一部分是MS FOR GNUWI32 塞德 不要在一起玩得很好。)

        7
  •  0
  •   Adrian R    11 年前

    我知道这是一条老路,但它仍然是一个问题。我的解决办法是增加 “del-sed*”到sed之后批处理文件的结尾。又快又脏。

        8
  •  0
  •   Seb T    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