2009-04-07 24 views
24

¿Alguien sabe de una forma (por ejemplo, Powershell o una herramienta) en Windows que puede recurrir a través de un directorio y convertir cualquier archivo Unix a archivos de Windows.Líneas nuevas de Unix a ventanas nuevas (en Windows)

Estaría perfectamente satisfecho con una forma en Powershell para detectar al menos un archivo Unix.

Es fácil hacer esto para un solo archivo, pero estoy buscando algo un poco más escalable (de ahí que me incline hacia una solución Powershellish).

+1

http: // superuser.com/questions/27060/batch-convert-files-for-encoding-or-line-ending-under-windows/ –

+0

Para las personas que piensan que necesitan hacer esto debido a un error de git repo, es posible que no. Es posible solucionar este problema con git de otras maneras, como: http://stackoverflow.com/questions/1510798/trying-to-fix-line-endings-with-git-filter-branch-but-having-no- suerte/1511273 # 1511273 –

Respuesta

28

Aquí está la forma pura de PowerShell si está interesado.

Búsqueda de archivos con al menos una línea que termina UNIX (PowerShell v1):

dir * -inc *.txt | %{ if (gc $_.FullName -delim "`0" | Select-String "[^`r]`n") {$_} } 

Aquí es cómo encontrar y encubiertas finales de línea de UNIX a finales de línea de Windows. Una cosa importante a tener en cuenta es que se agregará un final de línea adicional (\ r \ n) al final del archivo si todavía no hay una línea que termina al final. Si realmente no quieres eso, publicaré un ejemplo de cómo puedes evitarlo (es un poco más complejo).

Get-ChildItem * -Include *.txt | ForEach-Object { 
    ## If contains UNIX line endings, replace with Windows line endings 
    if (Get-Content $_.FullName -Delimiter "`0" | Select-String "[^`r]`n") 
    { 
     $content = Get-Content $_.FullName 
     $content | Set-Content $_.FullName 
    } 
} 

Los trabajos anteriores porque PowerShell dividirá automáticamente el contenido en \ n (dejando caer \ r si es que existen) y luego añadir \ r \ n cuando se escribe cada cosa (en este caso una línea) al archivo . Es por eso que siempre termina con una línea que termina al final del archivo.

Además, escribí el código anterior para que solo modifique los archivos que necesita. Si no te importa, puedes eliminar la declaración if. Oh, asegúrese de que solo los archivos lleguen al objeto ForEach. Aparte de eso, puede hacer el filtrado que desee al comienzo de esa canalización.

+0

¿Esto mantiene la codificación ASCII para archivos ASCII? ... –

+1

Por defecto, PowerShell funciona en "Unicode". No soy un experto en codificación de texto, pero aún no he tenido problemas con los valores predeterminados. Si lo desea, puede establecer explícitamente una codificación para los comandos Get-Content y Set-Content con el parámetro -Encoding. Get-Help Get-Content -Parameter Encoding – JasonMArcher

+0

@PeterSeale Set-Content o Out-File tienen un parámetro -Encoding que se puede usar para establecer el tipo de codificación del archivo. –

13

Hay dos2unix y unix2dos en Cygwin.

+2

Recomendaría esta técnica ya que las utilidades de Unix harán un mejor trabajo manteniendo la codificación del archivo original (UTF-8, ASCII, etc.). He tenido problemas con PS en el pasado cuando tenía la intención de mantener los archivos ASCII ASCII. –

+0

o msys y luego puede usar las utilidades de cmd. – Pod

+2

Uso powershell para listar los archivos y luego canalizarlo a dos2unix.exe de la siguiente manera: 'dir -Recurse -File -Exclude .git | % {dos2unix --u2d --skipbin $ _} ' – orad

1

Si Cygwin no es para ti, existen numerosos ejecutables independientes para unix2dos en Windows si buscas en Google, o puedes escribir uno tú mismo, mira mi pregunta similar (dirección opuesta para la conversión) here.

6

descarga vim, abrir su archivo y emisión

:se fileformat=dos|up 

lotes de múltiples archivos (todos los archivos .txt * en C: \ tmp - recursiva):

:args C:\tmp\**\*.txt 
:argdo se fileformat=dos|up 
+0

¿Puedes hacer esto para una carpeta o como un trabajo por lotes? – ninesided

+0

O descargue Eclipse, abra el archivo y conviértala en Delix. vim es sin duda una gran herramienta y la uso todos los días. ¿Pero no crees que es un poco excesivo usarlo para convertir endofline? –

+3

Es lo primero que se me vino a la mente, está en cada caja que tengo/administro. Por cierto, ¿estás sugiriendo que uses eclipse (85MB) y lo hagas archivo por archivo en lugar de usar vim (8.5MB) y hacerlo todo a la vez? – soulmerge

2

puede utilizar Visual Studio . Archivo -> Opciones avanzadas de guardado ...

0

Abrir un archivo con terminaciones de línea Unix en Wordpad y guardarlo reescribirá todas las terminaciones de línea como DOS. Un poco laborioso para grandes cantidades de archivos, pero funciona lo suficientemente bien para algunos archivos de vez en cuando.

1

Pasé 6 horas ayer y hoy probando el código anterior en un bucle con 10.000 archivos, muchos de ellos> 50kb de tamaño. En pocas palabras, el código de PowerShell es muy ineficiente/lento/inutilizable para archivos de gran tamaño y gran cantidad de archivos. Tampoco conserva los bytes BOM. Encontré que unix2dos 7.2.3 es la solución más rápida y práctica. Espero que esto ayude a otros y les ahorre tiempo.

+0

Esto tiene que ver con el hecho de que Get-Content es muy lento (e ineficiente), especialmente en archivos de mayor tamaño. – bluuf

5

Esto parece funcionar para mí.

Get-Content Unix.txt | Out-File Dos.txt 
Cuestiones relacionadas