views:

406

answers:

5

I'm trying to run the following command in Windows Server 2003 but sed creates a pile of files that I can't delete from the command line inside the current directory.

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

Does anyone have any suggestions? Mysteriously enough, I'm able to delete the files using Windows Explorer.

As requested, here are some example filenames:

  • sed0E3WZJ
  • sed5miXwt
  • sed6fzFKh

And, more troubleshooting info...

  • It occurs from both the command prompt & batch files
  • If I just need to run sed on a single directory, then I use sed "s/bad/good/g" *.* and everything is OK. Alas, I also need it to tackle all the subdirectories.
  • I only have Sed installed.
  • Sed is creating the files
A: 

you can just run sed without for loop

c:\test> sed -i.bak "s/bad/good/g" file*.*
Just tried that (minus the "file") in a folder named "Test" with a subdirectory named "New Folder" and I get the following error:C:\Documents and Settings\zchoy\Desktop\Test>"C:\Program Files\gnuwin32\bin\sed.exe" -i.bak "s/bad/good/g" *.*sed.exe: can't read New Folder: Permission deniedI also got a garbage file: sed3aQhvO
Zian Choy
+1  A: 

Cygwin hoses the ACLs on files sometimes, you'll probably have to use cacls or chmod to fix it up before you can delete the file.

Paul Betts
Unfortunately, I don't have Cygwin installed.
Zian Choy
@Zian cacls is a built-in Windows app, as is xcacls (the new 'cacls'). Also, I should've mentioned that GnuWin32's sed most likely also has this problem
Paul Betts
+1  A: 

Here is where a bit of troubleshooting comes into play. Does this happen when you run that command from the command-line and a batch file? What if you run sed on an individual file on the command line - does it create these files for every file, or just certain files/filetypes? Does it only happen for that replacement, or all replacements in general, or just always when you run sed.exe on a file? Is it only sed creating these files, or all Gnuwin32 exe's (eg. awk, cat, etc)? Does the same thing happen on a sed.exe from a new install of Gnuwin32? What error message does it give when you try to delete the files? Can you delete the files from explorer while the command prompt is still open? What if you close the command prompt and reopen it, then try to delete the files?

BlueRaja - Danny Pflughoeft
A: 

This is a stab in the dark, but it wouldn't surprise me in the least if the gnuwin32 implementation of sed is duff (i.e., faulty in some way). Can you try to replicate the problem using the AT&T U/Win POSIX support for windows? It is easy to install and includes the Korn shell, sed, and find, so you can use find instead of the FOR /R. (I'm wondering if part of the problem is that the MS FOR and gnuwin32 sed don't play nicely together.)

Norman Ramsey
+1  A: 

I have replicated your setup and I have the following observations.

  1. I dont think there is a problem in the loop. The simple command "C:\Program Files\gnuwin32\bin\sed.exe" -i "s/bad/good/g" . - creates the same set of temporary files.

  2. The files are indeed created by sed. sed creates these temporary files when the "in place" (-i) option is turned on. In the normal course, sed actually deletes the files (that is what happens in cygwin) using a call to the 'unlink' library. In case of gnuwin32, it looks like the 'unlink' fails. I have not been able to figure out why. I took a guess that maybe the unlink call is dependent on the gnuwin32 'coreutils' library and tried to download and install the coreutils library - no dice.

  3. If you remove the 'read-only' restriction in the parent folder before executing the sed command, you can delete the temporary files from windows command prompt. So that should give you some temporary respite.

I think we now have enough information to raise a bug report. If you agree, I think it may be a good idea to bring it to the notice of the good folks responsible for gnuwin32 and ask them for help.

NP Compete
Zian Choy

related questions