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
' _ {} +