Existem vários programas dedicados, incluindo
dos2unix
e unix2dos
das ferramentas dos2unix
todos
e fromdos
das 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 globstar
primeiro (você pode colocar esta linha na sua ~/.bashrc
). Você pode usar **/
no ksh93, mas precisa executar set -o globstar
primeiro (você pode colocar esta linha no seu ~/.kshrc
.
Se você só pode usar as ferramentas que exigem um redirecionamento, use um for
loop.
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 find
comando 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 .o
e 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 find
para 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 find
mé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
' _ {} +