Linux команда `dos2unix`: удаление скрытых символов Windows из файлов
При передаче текстовых файлов между системами Windows и Linux невидимые символы форматирования могут незаметно повредить ваши скрипты, файлы конфигурации и конвейеры обработки данных. Первопричина кроется в фундаментальном различии в том, как каждая операционная система обозначает конец строки: Windows использует последовательность возврат каретки + перевод строки (rn, также известную как CRLF), тогда как Linux ожидает только перевод строки (n, или LF). Этот лишний символ r — невидимый в большинстве редакторов — может приводить к сбоям shell-скриптов с непонятными ошибками, нарушать работу парсеров конфигурации и вызывать неожиданный вывод в инструментах обработки текста, таких как awk, sed и grep.
Утилита dos2unix была создана специально для решения этой проблемы. Она удаляет из текстовых файлов окончания строк в стиле Windows (CRLF) и заменяет их окончаниями в стиле Unix (LF), делая файлы полностью совместимыми с инструментами Linux. Это руководство охватывает всё, что вам нужно знать: что dos2unix делает под капотом, как установить её в основных дистрибутивах Linux, полный синтаксис и параметры, а также практические примеры из реальной жизни.
Что такое dos2unix и почему это важно?
dos2unix — это лёгкая утилита командной строки с открытым исходным кодом, которая конвертирует текстовые файлы из формата DOS/Windows (окончания строк CRLF) в формат Unix/Linux (окончания строк LF). Она также может выполнять обратное преобразование (unix2dos), обрабатывать классические окончания строк Mac (только CR) и выполнять операции с файлами, безопасные для бинарных данных.
Почему скрытые символы r вызывают реальные проблемы
Представьте Bash-скрипт, созданный или отредактированный на машине с Windows. При запуске на Linux вы можете увидеть ошибки вроде:
bash: ./deploy.sh: /bin/bash^M: bad interpreter: No such file or directoryЭтот ^M является визуальным представлением r. Оболочка не может найти интерпретатор, потому что строка shebang содержит скрытый символ возврата каретки. Аналогично, Python-скрипты, задания cron, файлы .env, а также файлы конфигурации Nginx или Apache могут вести себя непредсказуемо, если содержат окончания строк Windows.
Это особенно критично в серверных средах. Если вы управляете средой VPS Хостинга или Выделенным сервером, развёртывание неправильно настроенных скриптов или повреждённых файлов конфигурации может вывести сервисы из строя. Умение обнаруживать и исправлять проблемы с окончаниями строк — это фундаментальный навык системного администратора.
Как установить dos2unix на Linux
Большинство основных дистрибутивов Linux включают dos2unix в свои стандартные репозитории пакетов. Используйте подходящую команду для вашего дистрибутива:
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 dos2unixПосле установки убедитесь, что утилита доступна:
dos2unix --versionОбнаружение окончаний строк Windows перед конвертацией
Перед запуском dos2unix рекомендуется убедиться, что файл действительно содержит окончания строк CRLF. Для этого хорошо подходят несколько методов:
Использование file:
file filename.txtВывод для файла в формате Windows будет содержать CRLF line terminators.
Использование cat -A:
cat -A filename.txtОкончания строк Windows отображаются как ^M$ в конце каждой строки. Окончания строк Unix показывают только $.
Использование hexdump:
hexdump -C filename.txt | grep -i "0d 0a"Последовательность байт 0d 0a является шестнадцатеричным представлением rn.
Полный синтаксис команды dos2unix
dos2unix [options] [input_file] [output_file]При вызове только с входным файлом dos2unix конвертирует файл на месте, перезаписывая оригинал. Если указаны и входной, и выходной файлы, оригинал сохраняется, а конвертированное содержимое записывается в новый файл.
Справочник параметров dos2unix
| Параметр | Длинная форма | Описание |
|---|---|---|
-o | --oldfile | Конвертировать файлы в старом режиме (на месте) — поведение по умолчанию |
-n | --newfile | Конвертировать в новый файл, сохраняя оригинал |
-c | --convmode | Установить режим конвертации: unix, dos или mac |
-k | --keep-timestamp | Сохранить временную метку изменения исходного файла |
-q | --quiet | Подавить все выходные сообщения и предупреждения |
-v | --verbose | Выводить подробную информацию о конвертации |
-l | --newline | Добавить дополнительный символ новой строки |
-s | --safe | Автоматически пропускать бинарные файлы |
-f | --force | Принудительно конвертировать бинарные файлы |
-b | --keep-bom | Сохранить метку порядка байт (BOM), если она присутствует |
-r | --remove-bom | Удалить метку порядка байт (BOM) |
-V | --version | Отобразить номер версии и выйти |
-h | --help | Отобразить справочную информацию |
Практические примеры использования dos2unix
1. Конвертация одного файла на месте
Наиболее распространённый случай использования — конвертация файла с перезаписью его версией в формате Unix:
dos2unix filename.txtФайл изменяется напрямую. По умолчанию резервная копия не создаётся, поэтому при необходимости убедитесь, что у вас есть копия.
2. Конвертация файла с сохранением в новый файл
Чтобы сохранить исходный файл и записать конвертированный вывод в отдельный файл, используйте флаг -n (режим нового файла):
dos2unix -n filename.txt converted_filename.txtЭто считывает filename.txt, конвертирует его и записывает результат в converted_filename.txt. Оригинал остаётся нетронутым.
3. Конвертация нескольких файлов одновременно
Вы можете передать несколько имён файлов в одной команде:
dos2unix file1.txt file2.txt file3.txtВсе перечисленные файлы конвертируются на месте. Это эффективно для пакетных операций с небольшим набором известных файлов.
4. Конвертация всех файлов .txt в директории
Используйте glob-шаблоны оболочки или find для обработки целых директорий:
dos2unix *.txtИли рекурсивно по поддиректориям:
find /path/to/directory -type f -name "*.txt" -exec dos2unix {} ;Это особенно полезно при развёртывании файлов веб-приложений или наборов конфигураций, упакованных на машине с Windows.
5. Рекурсивная конвертация всех shell-скриптов
Типичная задача системного администратора — исправить все Bash-скрипты в директории проекта:
find /var/www/myapp -type f -name "*.sh" -exec dos2unix {} ;6. Сохранение исходной временной метки файла
По умолчанию dos2unix обновляет время изменения файла. Чтобы сохранить исходную временную метку (полезно в конвейерах развёртывания или когда make зависит от временных меток):
dos2unix -k filename.txt7. Тихий режим — подавление всего вывода
Идеально подходит для использования в shell-скриптах и автоматизации, где вы не хотите, чтобы сообщения о конвертации засоряли логи:
dos2unix -q filename.txt8. Конвертация в окончания строк Mac (только CR)
Хотя сегодня это редко требуется, вы можете конвертировать файл в классический формат Mac OS 9 (только возврат каретки, r), используя флаг режима конвертации -c:
dos2unix -c mac filename.txt9. Обратная конвертация из Unix в формат DOS
dos2unix поставляется вместе с unix2dos, которая выполняет обратную операцию — добавляет окончания CRLF для совместимости с Windows:
unix2dos filename.txt10. Удаление метки порядка байт (BOM)
Файлы, сохранённые приложениями Windows, иногда содержат UTF-8 BOM в начале, что может нарушать работу скриптов и парсеров на Linux. Удалите её с помощью:
dos2unix -r filename.txtИспользование dos2unix в shell-скриптах и автоматизации
dos2unix легко интегрируется в скрипты развёртывания и конвейеры CI/CD. Вот пример скрипта предварительного развёртывания, который очищает все файлы конфигурации и скрипты перед их вводом в эксплуатацию:
#!/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."Сделайте скрипт исполняемым и запустите его как часть вашего рабочего процесса развёртывания:
chmod +x pre-deploy-sanitize.sh
./pre-deploy-sanitize.shРаспространённые ошибки и устранение неполадок
dos2unix: command not found
Утилита не установлена. Выполните подходящую команду установки для вашего дистрибутива (см. раздел установки выше).
dos2unix: Binary file ... is skipped
dos2unix определила файл как бинарный и пропустила его. Если вы уверены, что файл является текстовым, принудительно выполните конвертацию с помощью:
dos2unix -f filenameСкрипт по-прежнему не работает после конвертации
Убедитесь, что конвертация прошла успешно:
file filename.shТеперь должно выводиться ASCII text или UTF-8 Unicode text без упоминания CRLF. Если проблемы сохраняются, проверьте наличие других проблем с кодировкой с помощью hexdump.
Отказано в доступе
Для изменения некоторых системных файлов могут потребоваться повышенные привилегии:
sudo dos2unix /etc/nginx/nginx.confdos2unix в сравнении с альтернативными методами
Хотя dos2unix является наиболее чистым решением, опытные администраторы Linux иногда используют другие инструменты для быстрых разовых конвертаций:
Использование sed:
sed -i 's/r//' filename.txtИспользование tr:
tr -d 'r' < input.txt > output.txtИспользование awk:
awk '{ sub("r$", ""); print }' filename.txt > output.txtИспользование vim:
:set ff=unix
:wqЭти альтернативы работают, но dos2unix создана специально для этой задачи, более корректно обрабатывает граничные случаи (такие как удаление BOM и обнаружение бинарных файлов) и является рекомендуемым инструментом для использования в производственной среде.
Актуальность для веб-хостинга и управления серверами
Проблемы с окончаниями строк — это не просто неудобство для разработчиков, а реальная операционная проблема в хостинговых средах. PHP-скрипты с окончаниями CRLF могут создавать неожиданные пробельные символы в HTTP-заголовках, вызывая сбои сессий и cookie. Python WSGI-приложения могут выдавать синтаксические ошибки. Файлы конфигурации Nginx и Apache со скрытыми символами r могут полностью препятствовать запуску сервисов.
Если вы размещаете сайты или приложения на плане Общего веб-хостинга или управляете собственным VPS с cPanel, включение dos2unix в рабочий процесс загрузки и развёртывания файлов является простой и высокоэффективной практикой. Для команд, выполняющих автоматизированные развёртывания на Выделенных серверах, добавление dos2unix в конвейер CI/CD устраняет целый класс ошибок, специфичных для среды, до того как они попадут в производство.
Кроме того, если ваша инфраструктура включает Почтовый хостинг с пользовательскими скриптами для обработки или фильтрации почты, обеспечение правильных окончаний строк Unix в этих скриптах необходимо для надёжной работы.
Краткий справочник
| Задача | Команда |
|---|---|
| Конвертировать файл на месте | dos2unix filename.txt |
| Конвертировать и сохранить в новый файл | dos2unix -n input.txt output.txt |
| Конвертировать несколько файлов | dos2unix file1.txt file2.txt file3.txt |
Рекурсивно конвертировать все файлы .sh | find . -name "*.sh" -exec dos2unix {} ; |
| Сохранить исходную временную метку | dos2unix -k filename.txt |
| Тихий режим (без вывода) | dos2unix -q filename.txt |
| Удалить BOM | dos2unix -r filename.txt |
| Конвертировать в формат Mac | dos2unix -c mac filename.txt |
| Обратная конвертация: Unix в DOS | unix2dos filename.txt |
| Проверить окончания строк | file filename.txt или cat -A filename.txt |
Заключение
Команда dos2unix — это небольшая утилита с огромным влиянием на кросс-платформенную разработку и администрирование серверов. Скрытые символы r являются одной из наиболее распространённых причин ошибок типа «работает на моей машине», когда файлы перемещаются между средами Windows и Linux — и dos2unix устраняет их чисто, безопасно и эффективно.
Освоив синтаксис и параметры, вы сможете предотвращать сбои при развёртывании, обеспечивать совместимость скриптов и поддерживать целостность файлов конфигурации во всей вашей инфраструктуре. Независимо от того, являетесь ли вы разработчиком, отправляющим код на Linux-сервер, системным администратором, управляющим парком машин, или владельцем сайта, загружающим файлы в хостинговую среду, включение dos2unix в стандартный набор инструментов — это простая передовая практика, которая окупается каждый раз, когда файлы пересекают границы операционных систем.
