quiere - Sed crea archivos que no se pueden borrar en Windows
eliminar archivos que no se dejan borrar windows 10 (8)
Estoy intentando ejecutar el siguiente comando en Windows Server 2003, pero sed crea una pila de archivos que no puedo eliminar de la línea de comandos dentro del directorio actual.
for /R %f in (*.*) do "C:/Program Files/gnuwin32/bin/sed.exe" -i "s/bad/good/g" "%f"
¿Alguien tiene alguna sugerencia? Misteriosamente, puedo eliminar los archivos usando el Explorador de Windows.
Según lo solicitado, aquí hay algunos nombres de archivos de ejemplo:
- sed0E3WZJ
- sed5miXwt
- sed6fzFKh
Y, más información para solucionar problemas ...
- Se produce tanto desde el símbolo del sistema como desde los archivos por lotes
- Si solo necesito ejecutar sed en un solo directorio, entonces uso
sed "s/bad/good/g" *.*
Y todo está bien. Por desgracia, también lo necesito para abordar todos los subdirectorios. - Sólo tengo instalado Sed.
- Sed está creando los archivos.
Aquí es donde entra en juego un poco de solución de problemas. ¿Ocurre esto 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? ¿Ocurre solo para ese reemplazo, o para todos los reemplazos en general, o solo siempre cuando ejecuta sed.exe en un archivo? ¿Es solo para crear estos archivos, o todos los ex Gnuwin32 (por ejemplo, awk, cat, etc.)? ¿Ocurre lo mismo en un sed.exe de una nueva instalación de Gnuwin32? ¿Qué mensaje de error aparece cuando intentas eliminar los archivos? ¿Se pueden eliminar los archivos del explorador mientras el indicador de comandos aún está abierto? ¿Qué sucede si cierras el símbolo del sistema y lo vuelves a abrir, luego intentas eliminar los archivos?
Como se trata de un error conocido en sed con la opción -i, puede ejecutar attrib -R <filename>
para eliminar el atributo de solo lectura del archivo una vez que se complete sed.
Alternativamente, no use la opción -i y redirija la salida a un archivo nuevo y luego elimine y cambie el nombre de la entrada y la salida.
Cygwin administra las ACL en los archivos a veces, es probable que tenga que usar cacls o chmod para solucionarlo antes de poder eliminar el archivo.
Esta es una puñalada en la oscuridad, pero no me sorprendería en lo más mínimo si la implementación de gnuwin32 de sed
es duff (es decir, defectuosa de alguna manera). ¿Puede intentar replicar el problema utilizando el soporte POS / Win POSIX de AT&T para Windows? Es fácil de instalar e incluye el shell Korn, sed
y find
, por lo que puede usar find
lugar de FOR /R
(Me pregunto si parte del problema es que MS FOR
y gnuwin32 sed
no juegan muy bien juntos).
Estoy usando este comando para limpiar los archivos temporales creados por sed de gnuwin32 :
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
He replicado su configuración y tengo las siguientes observaciones.
- No creo que haya un problema en el bucle. El comando simple "C: / Archivos de programa / gnuwin32 / bin / sed.exe" -i "s / bad / good / g" . - Crea el mismo conjunto de archivos temporales.
- Los archivos son creados por sed. sed crea estos archivos temporales cuando la opción "en el lugar" (-i) está activada. En el curso normal, sed en realidad elimina los archivos (eso es lo que sucede en cygwin) mediante una llamada a la biblioteca "desvincular". En el caso de gnuwin32, parece que el "desvincular" falla. No he podido averiguar por qué. Supuse que tal vez la llamada de desvinculación dependía de la biblioteca gnuwin32 ''coreutils'' e intenté descargar e instalar la biblioteca coreutils, no dados.
- Si elimina la restricción de ''solo lectura'' en la carpeta principal antes de ejecutar el comando sed, puede eliminar los archivos temporales del indicador de comandos de Windows. Así que 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 las buenas personas responsables de gnuwin32 y pedirles ayuda.
Mientras tanto, la siguiente versión limpia su archivo temporal:
Me doy cuenta de que este 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.
simplemente puede ejecutar sed sin for loop
c:/test> sed -i.bak "s/bad/good/g" file*.*