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

14

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

Ivan
fonte

Respostas:

17

Isso depende: se os arquivos estiverem sob controle de versão, pode ser uma decisão impopular poluidora da história. O Git tem a opção de converter automaticamente terminações de linha no check-out.

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

janmoesen
fonte
7

Existem vários programas dedicados, incluindo

  • dos2unixe unix2dosdas ferramentas dos2unix
  • todose fromdosdas ferramentas tofrodos

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


Se você não possui, mas possui Linux ou Cygwin:

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

Se você tem perl:

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

Com apenas as ferramentas POSIX (incluindo o BusyBox), para ir do unix para o 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 só vez, por exemplo

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

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

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

Você pode usar **/no bash ≥4, mas precisa executar shopt -s globstarprimeiro (você pode colocar esta linha na sua ~/.bashrc). Você pode usar **/no ksh93, mas precisa executar set -o globstarprimeiro (você pode colocar esta linha no seu ~/.kshrc.

Se você só pode usar as ferramentas que exigem um redirecionamento, use um forloop.

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

Se você não possui **/ou precisa de uma correspondência mais complexa para selecionar quais arquivos converter, use o findcomando Aqui está um exemplo do Linux / Cygwin que converte todos os arquivos no diretório atual e seus subdiretórios de forma recursiva, exceto os arquivos chamados .oe nos subdiretórios chamados bin.

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

Aqui está um exemplo POSIX. Dizemos findpara iniciar um shell que pode 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 findmétodo um pouco mais rápido, às custas de códigos mais complexos, 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
' _ {} +
Gilles 'SO- parar de ser mau'
fonte
2

O winscp também se converterá automaticamente, se solicitado .

Se seus arquivos residirem todos no mesmo diretório:

DIRECTORY=/your/directory
unix2dos $DIRECTORY/*
Nils
fonte
Você pode descrever um pouco mais, como alcançar através do WinSCP?
Sharma harish
@harishsharma Adicionei um link para "tell so".
Nils