Comando `dos2unix` de Linux: Eliminar caracteres ocultos de Windows de los archivos
Cuando transfiere archivos de texto entre sistemas Windows y Linux, los caracteres de formato invisibles pueden corromper silenciosamente sus scripts, archivos de configuración y canalizaciones de datos. La causa raíz es una diferencia fundamental en cómo cada sistema operativo marca el final de una línea: Windows usa una secuencia de retorno de carro + salto de línea (rn, también conocida como CRLF), mientras que Linux espera solo un salto de línea (n, o LF). Ese carácter r adicional — invisible en la mayoría de los editores — puede hacer que los scripts de shell fallen con errores crípticos, romper los analizadores de configuración y producir resultados inesperados en herramientas de procesamiento de texto como awk, sed y grep.
La utilidad dos2unix fue creada específicamente para resolver este problema. Elimina los finales de línea CRLF de estilo Windows de los archivos de texto y los reemplaza con finales de línea LF de estilo Unix, haciendo que sus archivos sean totalmente compatibles con las cadenas de herramientas de Linux. Esta guía cubre todo lo que necesita saber: qué hace dos2unix internamente, cómo instalarlo en las principales distribuciones de Linux, su sintaxis y opciones completas, y ejemplos prácticos del mundo real.
¿Qué es dos2unix y por qué es importante?
dos2unix es una utilidad de línea de comandos ligera y de código abierto que convierte archivos de texto del formato DOS/Windows (finales de línea CRLF) al formato Unix/Linux (finales de línea LF). También puede realizar la conversión inversa (unix2dos), manejar finales de línea clásicos de Mac (solo CR) y procesar operaciones de archivos seguras para binarios.
Por qué los caracteres r ocultos causan problemas reales
Considere un script Bash creado o editado en una máquina Windows. Cuando lo ejecuta en Linux, podría ver errores como:
bash: ./deploy.sh: /bin/bash^M: bad interpreter: No such file or directoryEse ^M es la representación visual de r. El shell no puede encontrar el intérprete porque la línea shebang contiene un retorno de carro oculto. De manera similar, los scripts de Python, los trabajos cron, los archivos .env y los archivos de configuración de Nginx o Apache pueden comportarse de manera impredecible cuando contienen finales de línea de Windows.
Esto es especialmente crítico en entornos de servidor. Si administra un entorno de VPS Hosting o un Servidor Dedicado, implementar scripts mal configurados o archivos de configuración corruptos puede interrumpir los servicios. Saber cómo detectar y corregir problemas de finales de línea es una habilidad fundamental de administración de sistemas.
Cómo instalar dos2unix en Linux
La mayoría de las principales distribuciones de Linux incluyen dos2unix en sus repositorios de paquetes predeterminados. Use el comando apropiado para su distribución:
Debian / Ubuntu
sudo apt-get update && sudo apt-get install dos2unixCentOS / RHEL / AlmaLinux / Rocky Linux
sudo yum install dos2unixFedora
sudo dnf install dos2unixArch Linux
sudo pacman -S dos2unixopenSUSE
sudo zypper install dos2unixDespués de la instalación, verifique que esté disponible:
dos2unix --versionDetección de finales de línea de Windows antes de convertir
Antes de ejecutar dos2unix, es una buena práctica confirmar que un archivo realmente contiene finales de línea CRLF. Varios métodos funcionan bien:
Usando file:
file filename.txtLa salida para un archivo en formato Windows incluirá CRLF line terminators.
Usando cat -A:
cat -A filename.txtLos finales de línea de Windows aparecen como ^M$ al final de cada línea. Los finales de línea Unix muestran solo $.
Usando hexdump:
hexdump -C filename.txt | grep -i "0d 0a"La secuencia de bytes 0d 0a es la representación hexadecimal de rn.
Sintaxis completa del comando dos2unix
dos2unix [options] [input_file] [output_file]Cuando se llama solo con un archivo de entrada, dos2unix convierte el archivo en su lugar, sobrescribiendo el original. Cuando se especifican tanto un archivo de entrada como uno de salida, el original se conserva y el contenido convertido se escribe en el nuevo archivo.
Referencia de opciones de dos2unix
| Opción | Forma larga | Descripción |
|---|---|---|
-o | --oldfile | Convertir archivos en modo antiguo (en su lugar) — el comportamiento predeterminado |
-n | --newfile | Convertir a un nuevo archivo, conservando el original |
-c | --convmode | Establecer modo de conversión: unix, dos o mac |
-k | --keep-timestamp | Conservar la marca de tiempo de modificación del archivo original |
-q | --quiet | Suprimir todos los mensajes de salida y advertencias |
-v | --verbose | Imprimir información detallada de conversión |
-l | --newline | Agregar un carácter de nueva línea adicional |
-s | --safe | Omitir archivos binarios automáticamente |
-f | --force | Forzar la conversión de archivos binarios |
-b | --keep-bom | Conservar la Marca de Orden de Bytes (BOM) si está presente |
-r | --remove-bom | Eliminar la Marca de Orden de Bytes (BOM) |
-V | --version | Mostrar el número de versión y salir |
-h | --help | Mostrar información de ayuda |
Ejemplos prácticos del uso de dos2unix
1. Convertir un solo archivo en su lugar
El caso de uso más común — convertir un archivo y sobrescribirlo con la versión formateada para Unix:
dos2unix filename.txtEl archivo se modifica directamente. No se crea ninguna copia de seguridad de forma predeterminada, así que asegúrese de tener una copia si es necesario.
2. Convertir un archivo y guardar en un nuevo archivo
Para conservar el archivo original y escribir la salida convertida en un archivo separado, use el indicador -n (modo de nuevo archivo):
dos2unix -n filename.txt converted_filename.txtEsto lee filename.txt, lo convierte y escribe el resultado en converted_filename.txt. El original permanece intacto.
3. Convertir múltiples archivos a la vez
Puede pasar múltiples nombres de archivo en un solo comando:
dos2unix file1.txt file2.txt file3.txtTodos los archivos listados se convierten en su lugar. Esto es eficiente para operaciones por lotes en un pequeño conjunto de archivos conocidos.
4. Convertir todos los archivos .txt en un directorio
Use globbing de shell o find para procesar directorios completos:
dos2unix *.txtO de forma recursiva en subdirectorios:
find /path/to/directory -type f -name "*.txt" -exec dos2unix {} ;Esto es particularmente útil al implementar archivos de aplicaciones web o conjuntos de configuración que fueron empaquetados en una máquina Windows.
5. Convertir todos los scripts de shell de forma recursiva
Una tarea común de administración de sistemas — corregir todos los scripts Bash en un directorio de proyecto:
find /var/www/myapp -type f -name "*.sh" -exec dos2unix {} ;6. Conservar la marca de tiempo del archivo original
De forma predeterminada, dos2unix actualiza la hora de modificación del archivo. Para mantener la marca de tiempo original (útil en canalizaciones de implementación o cuando make depende de las marcas de tiempo):
dos2unix -k filename.txt7. Modo silencioso — suprimir toda la salida
Ideal para usar en scripts de shell y automatización donde no desea que los mensajes de conversión saturen los registros:
dos2unix -q filename.txt8. Convertir a finales de línea de Mac (solo CR)
Aunque rara vez se necesita hoy en día, puede convertir un archivo al formato clásico de Mac OS 9 (solo retorno de carro, r) usando el indicador de modo de conversión -c:
dos2unix -c mac filename.txt9. Convertir de Unix de vuelta al formato DOS
dos2unix se distribuye junto con unix2dos, que realiza la operación inversa — agregando finales CRLF para compatibilidad con Windows:
unix2dos filename.txt10. Eliminar la Marca de Orden de Bytes (BOM)
Los archivos guardados por aplicaciones de Windows a veces incluyen una BOM UTF-8 al principio, que puede romper scripts y analizadores en Linux. Elimínela con:
dos2unix -r filename.txtUso de dos2unix en scripts de shell y automatización
dos2unix se integra limpiamente en scripts de implementación y canalizaciones CI/CD. Aquí hay un ejemplo de un script de pre-implementación que sanea todos los archivos de configuración y scripts antes de que entren en producción:
#!/bin/bash
# pre-deploy-sanitize.sh
# Converts all text files to Unix format before deployment
TARGET_DIR="/var/www/myapp"
echo "Sanitizing line endings in $TARGET_DIR..."
find "$TARGET_DIR" -type f ( -name "*.sh" -o -name "*.conf" -o -name "*.php" -o -name "*.py" ) | while read -r file; do
dos2unix -q -k "$file"
echo "Converted: $file"
done
echo "Done. All files converted to Unix format."Haga el script ejecutable y ejecútelo como parte de su flujo de trabajo de implementación:
chmod +x pre-deploy-sanitize.sh
./pre-deploy-sanitize.shErrores comunes y solución de problemas
dos2unix: command not found
La utilidad no está instalada. Ejecute el comando de instalación apropiado para su distribución (consulte la sección de instalación anterior).
dos2unix: Binary file ... is skipped
dos2unix detectó lo que cree que es un archivo binario y lo omitió. Si está seguro de que el archivo es texto, fuerce la conversión con:
dos2unix -f filenameEl script sigue fallando después de la conversión
Verifique que la conversión funcionó:
file filename.shAhora debería reportar ASCII text o UTF-8 Unicode text sin mencionar CRLF. Si los problemas persisten, verifique otros problemas de codificación usando hexdump.
Permiso denegado
Es posible que necesite privilegios elevados para modificar ciertos archivos del sistema:
sudo dos2unix /etc/nginx/nginx.confdos2unix vs. métodos alternativos
Aunque dos2unix es la solución más limpia, los administradores de Linux experimentados a veces usan otras herramientas para conversiones rápidas puntuales:
Usando sed:
sed -i 's/r//' filename.txtUsando tr:
tr -d 'r' < input.txt > output.txtUsando awk:
awk '{ sub("r$", ""); print }' filename.txt > output.txtUsando vim:
:set ff=unix
:wqEstas alternativas funcionan, pero dos2unix está diseñado específicamente para esta tarea, maneja casos extremos (como la eliminación de BOM y la detección de archivos binarios) de manera más elegante, y es la herramienta recomendada para uso en producción.
Relevancia para el alojamiento web y la administración de servidores
Los problemas de finales de línea no son solo una inconveniencia para los desarrolladores — son una preocupación operativa genuina en entornos alojados. Los scripts PHP con finales CRLF pueden producir espacios en blanco inesperados en los encabezados HTTP, causando fallos en sesiones y cookies. Las aplicaciones Python WSGI pueden lanzar errores de sintaxis. Los archivos de configuración de Nginx y Apache con caracteres r ocultos pueden impedir que los servicios se inicien por completo.
Si aloja sitios web o aplicaciones en un plan de Alojamiento Web Compartido o administra su propio VPS con cPanel, incorporar dos2unix en su flujo de trabajo de carga e implementación de archivos es una práctica simple y de alto valor. Para equipos que ejecutan implementaciones automatizadas en Servidores Dedicados, agregar dos2unix a su canalización CI/CD elimina toda una clase de errores específicos del entorno antes de que lleguen a producción.
Además, si su infraestructura incluye Alojamiento de Correo Electrónico con scripts personalizados para el procesamiento o filtrado de correo, garantizar que esos scripts usen finales de línea Unix correctos es esencial para un funcionamiento confiable.
Resumen de referencia rápida
| Tarea | Comando |
|---|---|
| Convertir archivo en su lugar | dos2unix filename.txt |
| Convertir y guardar en nuevo archivo | dos2unix -n input.txt output.txt |
| Convertir múltiples archivos | dos2unix file1.txt file2.txt file3.txt |
Convertir todos los archivos .sh de forma recursiva | find . -name "*.sh" -exec dos2unix {} ; |
| Conservar marca de tiempo original | dos2unix -k filename.txt |
| Modo silencioso (sin salida) | dos2unix -q filename.txt |
| Eliminar BOM | dos2unix -r filename.txt |
| Convertir al formato Mac | dos2unix -c mac filename.txt |
| Inverso: Unix a DOS | unix2dos filename.txt |
| Verificar finales de línea | file filename.txt o cat -A filename.txt |
Conclusión
El comando dos2unix es una pequeña utilidad con un impacto desproporcionado en el desarrollo multiplataforma y la administración de servidores. Los caracteres r ocultos son una de las causas más comunes de los errores de “funciona en mi máquina” cuando los archivos se mueven entre entornos Windows y Linux — y dos2unix los elimina de manera limpia, segura y eficiente.
Al dominar su sintaxis y opciones, puede prevenir fallos de implementación, garantizar la compatibilidad de los scripts y mantener la integridad de los archivos de configuración en toda su infraestructura. Ya sea que sea un desarrollador que envía código a un servidor Linux, un administrador de sistemas que gestiona un conjunto de máquinas, o un propietario de sitio que carga archivos a un entorno de alojamiento, hacer de dos2unix parte de su conjunto de herramientas estándar es una práctica recomendada sencilla que ofrece beneficios cada vez que los archivos cruzan los límites del sistema operativo.
