Pergunta

Eu tenho um monte (centenas) de arquivos que deveriam ter finais de linha Unix. Eu suspeito fortemente que alguns deles têm terminações de linha do Windows, e eu quero descobrir programaticamente fora que fazer.

Eu sei que posso apenas correr

flip -u
ou algo semelhante em um script para converter tudo, mas eu quero ser capaz de identificar os arquivos que precisam mudar primeiro.

Foi útil?

Solução

Você pode usar grep

egrep -l $'\r'\$ *

Outras dicas

Você pode usar o file ferramenta, que irá dizer-lhe o tipo de linha final. Ou, você pode simplesmente usar dos2unix -U que irá converter tudo para finais de linha Unix, independentemente do que começou.

Algo ao longo das linhas de:

perl -p -e 's[\r\n][WIN\n]; s[(?<!WIN)\n][UNIX\n]; s[\r][MAC\n];' FILENAME

embora alguns dos que regexp pode precisar de refino e arrumando a casa.

Essa saída'LL seu arquivo com Win, Mac ou UNIX no final de cada linha. Bom se o arquivo é de alguma forma uma bagunça terrível (ou um diff) e tem terminações mistos.

Aqui está a resposta mais à prova de falhas. Stimms responder a conta doesn para subdiretórios e arquivos binários

find . -type f -exec file {} \; | grep "CRLF" | awk -F ':' '{ print $1 }'
  • Use file para encontrar o tipo de arquivo. Aqueles com CRLF têm janelas retornar caracteres. A saída do file é delimitada por uma :, eo primeiro campo é o caminho do arquivo.

Unix usa um byte, 0x0A (Alimentação de linhas), enquanto o Windows usa dois bytes, 0x0D 0x0A (retorno de carro, alimentação de linha).

Se você nunca ver um 0x0D, então é muito provável Unix. Se você ver pares 0x0D 0x0A então é MSDOS muito provável.

Windows uso de char 13 & 10 para de fim de linha, unix apenas um deles (eu não rememeber qual). Então você pode substituir caractere 13 e 10 para caractere 13 ou 10 (aquele que usar unix).

Quando você sabe quais arquivos tem terminações do Windows de linha (0x0D 0x0A ou \r \n), o que você vai fazer com que os arquivos? Suponho, você vai convertê-los em fins de linha Unix (0x0A ou \n). Você pode converter arquivo com terminações de linha do Windows em finais de linha Unix com utilidade sed, apenas o comando use:

$> sed -i 's/\r//' my_file_with_win_line_endings.txt

Você pode colocá-lo em script como este:

#!/bin/bash

function travers()
{
    for file in $(ls); do
        if [ -f "${file}" ]; then
            sed -i 's/\r//' "${file}"
        elif [ -d "${file}" ]; then
            cd "${file}"
            travers
            cd ..
        fi
    done
}

travers

Se você executá-lo a partir do seu diretório raiz com arquivos, no final você vai ter certeza de todos os arquivos estão com terminações de linha Unix.

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