2009-12-01 12 views
16

Estoy tratando de ejecutar el siguiente comando en Windows Server 2003, pero sed crea un montón de archivos que no puedo borrar de la línea de comandos en el directorio actual.Sed crea archivos no-que se puedan eliminar en Windows

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

¿Alguien tiene alguna sugerencia? Misteriosamente, soy capaz de eliminar los archivos usando Windows Explorer.

a lo solicitado, he aquí algunos nombres de archivo de ejemplo:

  • sed0E3WZJ
  • sed5miXwt
  • sed6fzFKh

Y, más información de solución de problemas ...

  • Ocurre desde el símbolo del sistema & archivos por lotes
  • Si tan sólo tenga que ejecutar sed en un solo directorio, entonces yo uso sed "s/bad/good/g" *.* y todo está bien. Por desgracia, también necesito que aborde todos los subdirectorios.
  • sólo tiene SED instalado.
  • Sed es la creación de los archivos
+0

Sería de gran ayuda si usted mostró un nombre de archivo ejemplo. Probé tu comando con "c: \ cygwin \ bin \ sed.exe" y funcionó bien, salvo una advertencia sobre barras diagonales contra barras diagonales. –

+0

sed -i realmente funciona bastante bien para mí si el archivo no es de solo lectura para empezar. No hay archivos temporales no recuperables sobrantes y sin errores. Debo mencionar que lo estoy usando en combinación con find en lugar de en for loop. – mjohnsonengr

Respuesta

17

He replicado su configuración y tengo las siguientes observaciones.

  1. no creo que hay un problema en el circuito. El comando simple "C: \ Archivos de programa \ gnuwin32 \ bin \ sed.exe" -i "s/bad/good/g" . - crea el mismo conjunto de archivos temporales.
  2. Los archivos fueron creados por sed. sed crea estos archivos temporales cuando la opción "en el lugar" (-i) está activada. En el curso normal, sed realmente borra los archivos (eso es lo que sucede en cygwin) usando una llamada a la biblioteca 'desvincular'. En el caso de gnuwin32, parece que el 'desvincular' falla. No he podido averiguar por qué. Adiviné que tal vez la llamada de desvinculación depende de la biblioteca gnuwin32 'coreutils' y trató de descargar e instalar la biblioteca de coreutils, sin dados.
  3. Si se quita la 'sólo lectura' restricción en la carpeta principal antes de ejecutar el comando sed, puede eliminar los archivos temporales de Windows símbolo del sistema. Entonces eso debería darte un respiro temporal.

Creo que ahora tenemos suficiente información para generar un informe de error. Si está de acuerdo, creo que puede ser una buena idea avisar a los buenos responsables de gnuwin32 y pedirles ayuda.

Mientras tanto, la siguiente versión limpia su archivo temporal:

+4

Es un error conocido (http://sourceforge.net/projects/gnuwin32/forums/forum/74807/topic/845128). Yo he presentado un informe de error, pero no estoy de esperanza (https://sourceforge.net/tracker/?func=detail&aid=2931036&group_id=23617&atid=379173). –

+0

6 años y contando ... –

0

que sólo puede ejecutar sin sed de bucle

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

acaba de intentar que (menos el "archivo") en una carpeta denominada "prueba" con un subdirectorio llamado "Nueva carpeta" y me sale el siguiente error: C: \ Documents and Settings \ zchoy \ Desktop \ Prueba> "C: \ Archivos de programa \ gnuwin32 \ bin \ sed.exe "-i.bak" s/bad/good/g "*. * sed.exe: no se puede leer Nueva carpeta: Permiso denegado También recibí un archivo de basura : sed3aQhvO –

1

Cygwin riega el ACL en archivos a veces, es probable que tendrá que utilizar cacls o chmod para fijarlo antes de que puedas eliminar el archivo.

+0

Lamentablemente, no tengo instalado Cygwin. –

+1

@Zian cacls es una aplicación de Windows integrada, como es xcacls (los nuevos 'cacls'). También, que debería haber mencionado que GnuWin32 de sed más probable es que también tiene este problema –

1

Aquí es donde un poco de solución de problemas entra en juego. ¿Esto sucede cuando ejecuta ese comando desde la línea de comandos y un archivo por lotes? ¿Qué sucede si ejecuta sed en un archivo individual en la línea de comandos? ¿Crea estos archivos para cada archivo, o solo ciertos archivos/tipos de archivos? ¿Solo ocurre con ese reemplazo, o con todos los reemplazos en general, o solo cuando ejecuta sed.exe en un archivo? ¿Solo se está creando estos archivos, o todos los exe de Gnuwin32 (p. Ej., Awk, cat, etc.)? ¿Ocurre lo mismo en un sed.exe de una nueva instalación de Gnuwin32? ¿Qué mensaje de error proporciona cuando intentas eliminar los archivos? ¿Puedes borrar los archivos del explorador mientras el símbolo del sistema todavía está abierto? ¿Qué sucede si cierra el símbolo del sistema y lo vuelve a abrir, y luego intenta eliminar los archivos?

0

Esto es una puñalada en la oscuridad, pero no me sorprendería en absoluto si la implementación gnuwin32 de sed es duff (es decir, defectuosa de alguna manera). ¿Puedes tratar de replicar el problema usando el soporte POSIX AT&T U/Win para Windows? Es fácil de instalar e incluye el shell Korn, sed, y find, por lo que puede utilizar en lugar de la findFOR /R. (Me pregunto si parte del problema es que el MS FOR y el gnuwin32 sed no funcionan bien juntos.)

3

Como se trata de un error conocido de sed con la opción -i puede ejecutar attrib -R <filename> para extirpar sólo la lectura atributo del archivo después de que sed complete.

alternativa no utilice la opción -i y redirigir la salida a un archivo nuevo y luego borrar y renombrar la entrada y la salida.

+0

O ejecute attrib -R antes de ejecutar "sed -i" – mjohnsonengr

0

Soy consciente de que es un hilo viejo pero sigue siendo un problema. Mi solución es agregar "DEL sed *" al final de un archivo por lotes después de sed. Rápido y sucio.

+0

Pensé en eso, desafortunadamente, esta tirita no funcionará para mí por dos razones: 1. Tengo archivos en mi proyecto que tiene un nombre que comienza con sed. 2. Cualquier desarrollador que trabaje en mi proyecto puede agregar archivos adicionales que tengan un nombre que empiece por sed. –

0

estoy usando este comando para limpiar los archivos temporales creados por 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 
Cuestiones relacionadas