Pergunta

Alguém sabe de uma maneira (dizem PowerShell, ou uma ferramenta) no Windows que podem recurse mais de um diretório e converter qualquer arquivo UNIX para arquivos do Windows.

Eu seria perfeitamente feliz com a forma como PowerShell para pelo menos detectar um arquivo Unix.

É fácil fazer isso por um único arquivo, mas eu estou atrás de algo um pouco mais escalável (daí inclinando-se para uma solução Powershellish).

Foi útil?

Solução

Aqui é a maneira PowerShell puro se você estiver interessado.

Como encontrar arquivos com pelo menos uma linha de UNIX final (PowerShell v1):

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

Aqui está como você encontrar e converter finais de linha Unix para finais de linha do Windows. Uma coisa importante a notar é que uma linha extra final (\ r \ n) será adicionado ao final do arquivo se não houver já uma linha que termina no final. Se você realmente não quer isso, eu vou postar um exemplo de como você pode evitá-lo (ele é um pouco mais complexo).

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
    }
}

As obras acima porque PowerShell irá dividir automaticamente o conteúdo on \ n (caindo \ r se existirem) e, em seguida, adicionar \ r \ n quando se escreve cada coisa (neste caso, uma linha) para o arquivo. É por isso que você sempre acabar com uma linha que termina no final do arquivo.

Além disso, eu escrevi o código acima para que ele só arquivos modifica que ele precisa. Se você não se preocupam com que você pode remover a instrução if. Oh, certifique-se de que apenas os arquivos de chegar ao ForEach-Object. Diferente do que você pode fazer o que a filtragem que você quer no início desse pipeline.

Outras dicas

Há dos2unix e unix2dos em Cygwin .

Isso parece funcionar para mim.

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

vim , abra o arquivo e emissão

:se fileformat=dos|up

Batch para vários arquivos (todos os arquivos * .txt em C: \ tmp - recursiva):

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

Você pode usar o Visual Studio. Arquivo -> Salvar opções avançadas ...

Se Cygwin não é para você, existem inúmeras executáveis ??standalone para unix2dos no Windows se você Google ao redor, ou você poderia escrever um você mesmo, ver o meu semelhante (direção oposta para a conversão) pergunta here .

Passei 6 horas ontem e hoje testar o código dado acima em um loop com 10.000 arquivos, muitos deles> 50kb de tamanho. Bottom line, o código PowerShell é muito ineficiente / lento / inutilizável para arquivos grandes e grande número de arquivos. Ele também não preserva bytes BOM. Eu encontrei unix2dos 7.2.3 ser a solução mais rápida e prática. Espero que isso ajude os outros e economiza tempo.

A abertura de um arquivo com terminações de linha Unix em Wordpad e salvá-lo irá reescrever todos os finais de linha como DOS. Um pouco trabalhoso para um grande número de arquivos, mas funciona bem o suficiente para alguns arquivos de vez em quando.

Ele funciona para mim:

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

Como sobre isso (com lookbehind negativo). Sem -nonewline, Set-Content põe `r`n extra na parte inferior. Com os parênteses, você pode modificar o mesmo arquivo.

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

O inverso seria isso, janelas de texto unix.

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

Exemplos:

unix2dos file.txt
dos2unix file.txt

Se você tiver emacs, você pode verificá-lo com hexl-mode esc-x. Bloco de Notas não irá exibir texto unix corretamente. Eu tenho que especificar o caminho para o set-conteúdo, porque -replace apaga a PSPath.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top