Como converter em massa todo o arquivo em uma ramificação do sistema de arquivos entre o Unix e o formato de quebra de linha do Windows?

10

Todo mundo sabe :-) que em arquivos de texto simples do Windows as linhas são terminadas com CR + LF, e em Unix e Linux - somente com LF. Como posso converter rapidamente todos os meus arquivos de código-fonte de um formato para outro e voltar?

    
por Ivan 14.10.2011 / 14:44

3 respostas

14

Isso depende: se os arquivos estiverem sob controle de versão, isso pode ser uma decisão bastante impopular que polua a história. O Git tem a opção de converter automaticamente terminais de linha no check-out.

Se você não se importa e quer converter rapidamente, existem programas como fromdos / todos e dos2unix / unix2dos que fazem isso para você. Você pode usar find : find . -type f -name '*.php' -exec dos2unix '{}' + .

    
por 14.10.2011 / 15:09
4

Existem vários programas dedicados, incluindo

Basta escolher a ferramenta para a direção apropriada e passar os nomes dos arquivos para converter na linha de comando.

Se você também não tem, mas tem Linux ou Cygwin:

sed -i -e 's/\r\+$//' filename             # dos|unix -> unix
sed -i -e 's/\r*$/\r/' filename            # dos|unix -> dos

Se você tiver perl:

perl -i -pe 's/\r+$//' filename            # dos|unix -> unix
perl -i -pe 's/\r*$/\r/' filename          # dos|unix -> dos

Com apenas ferramentas POSIX (incluindo BusyBox), para ir de unix para dos, você precisará passar o caractere CR literalmente no comando sed.

cr=$(echo | tr '\n' '\r')
sed -e "s/$cr*\$/$cr/" <filename >filename.dos
mv filename.dos filename

Na outra direção, você pode simplesmente excluir todos os CRs:

tr -d '\r' <filename >filename.dos
mv filename.dos filename

Você pode usar curingas para converter muitos arquivos no mesmo diretório de uma vez, por exemplo,

sed -i -e 's/\r\+$//' *.txt

Para converter todos os arquivos no diretório atual e em seus subdiretórios, se seu shell for zsh, você poderá usar **/ , por exemplo

sed -i -e 's/\r\+$//' **/*.txt

Você pode usar **/ no bash ≥4, mas você precisa executar shopt -s globstar primeiro (você pode colocar essa linha no seu ~/.bashrc ). Você pode usar **/ em ksh93, mas você precisa executar set -o globstar primeiro (você pode colocar essa linha em ~/.kshrc .

Se você puder usar apenas as ferramentas que exigem um redirecionamento, use um loop for .

for x in *.txt; do
  tr -d '\r' <"$x" >"$x.dos"
  mv -- "$x.dos" "$x"
done

Se você não tiver **/ ou precisar de correspondência mais complexa para selecionar quais arquivos converter, use o comando find . Aqui está um exemplo do Linux / Cygwin que converte todos os arquivos sob o diretório atual e seus subdiretórios recursivamente, exceto para arquivos chamados .o e em subdiretórios chamados bin .

find -name 'bin' -type d -prune -o \
     \! -name '*.o' \
     -exec sed -i -e 's/\r\+$//' {} +

Aqui está um exemplo de POSIX. Informamos a find para iniciar um shell que possa executar o redirecionamento necessário.

find -name 'bin' -type d -prune -o \
     \! -name '*.o' \
     -exec sh -c '
       tr -d '\r' <"$0" >"$0.dos"
       mv -- "$0.dos" "$0"
' {} \;

Você pode tornar o método find um pouco mais rápido, às custas de um código mais complexo, usando um loop no comando shell.

find -name 'bin' -type d -prune -o \
     \! -name '*.o' \
     -exec sh -c '
       for x; do
         tr -d '\r' <"$x" >"$x.dos"
         mv -- "$x.dos" "$x"
       done
' _ {} +
    
por 16.09.2012 / 18:19
2

winscp também será convertido automaticamente, se for dito.

Se os seus arquivos residirem no mesmo diretório:

DIRECTORY=/your/directory
unix2dos $DIRECTORY/*
    
por 14.10.2011 / 22:40