Pregunta

¿Alguien sabe de una manera (Powershell decir, o una herramienta) en Windows que puede recursivamente sobre un directorio y convertir cualquier archivo de UNIX a archivos de Windows.

Yo sería muy feliz con una forma de 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 se inclina hacia una solución Powershellish).

¿Fue útil?

Solución

Esta es la forma pura 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 destacar es que una línea adicional que termina (\ r \ n) se añade al final del archivo si no hay ya una línea que termina al final. Si realmente no quiere que eso, voy a publicar un ejemplo de cómo se puede evitar (que 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 un final de línea al final del archivo.

Además, me escribió el código anterior para que sólo modifica los archivos que necesita para. Si no se preocupan por que se puede extraer de la sentencia if. Oh, asegúrese de que sólo los archivos llegan a la ForEach-Object. Aparte de eso se puede hacer lo que el filtrado que desea al inicio de esa tubería.

Otros consejos

Hay dos2unix y unix2dos en Cygwin .

Esto parece funcionar para mí.

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

vim , abrir su archivo y emisión

:se fileformat=dos|up

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

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

Puede utilizar Visual Studio. Archivo -> Opciones avanzadas para guardar ...

Si Cygwin no es para ti, hay numerosos ejecutables independientes para unix2dos bajo Windows si Google alrededor, o se podría escribir uno usted mismo, ver a mi similar (dirección opuesta a la conversión) pregunta here .

Me pasé 6 horas de ayer y hoy probando el código proporcionado anteriormente en un bucle con 10.000 archivos, muchos de ellos> 50 kb de tamaño. En pocas palabras, el código de PowerShell es muy ineficiente / lento / inutilizable para archivos de gran tamaño y gran número de archivos. También no conserva bytes lista de materiales. He encontrado unix2dos 7.2.3 ser la solución más rápida y práctica. Espero que esto ayuda a los demás y les ahorra tiempo.

La apertura de un archivo con los finales de línea Unix en Wordpad y el ahorro que se reescribir todos los finales de línea como DOS. Un poco laborioso para un gran número de archivos, pero funciona bastante bien para algunos archivos de vez en cuando.

A mí me funciona:

 Get-ChildItem -Recurse -File | % { $tmp = Get-Content $_; $tmp | Out-File "$_" -Encoding UTF8 }

¿Qué tal esto (con búsqueda hacia atrás negativo). Sin -nonewline, configuración de contenido pone `r`n adicional en la parte inferior. Con los paréntesis, se puede modificar el mismo archivo.

function unix2dos {
    (Get-Content -raw $args[0]) -replace "(?<!`r)`n","`r`n" | 
    set-content -nonewline $args[0]
}

Lo contrario sería esto, ventanas de texto UNIX.

function dos2unix {
    (Get-Content -raw $args[0]) -replace "`r`n","`n" | 
    set-content -nonewline $args[0]
}

Ejemplos:

unix2dos file.txt
dos2unix file.txt

Si tiene emacs, se puede comprobar con hexl modo ESC-x. Bloc de notas no se mostrará el texto de UNIX correctamente. Tengo que especificar la ruta de configuración de contenido, porque -replace borra la pspath.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top