15%

Сэкономьте 15% на всех хостинговых услугах

Проверьте свои навыки и получите скидку на любой тарифный план

Используйте код:

Skills
Начать
24.10.2024
1 +1

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 dos2unix

CentOS / RHEL / AlmaLinux / Rocky Linux

sudo yum install dos2unix

Fedora

sudo dnf install dos2unix

Arch Linux

sudo pacman -S dos2unix

openSUSE

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.txt

7. Тихий режим — подавление всего вывода

Идеально подходит для использования в shell-скриптах и автоматизации, где вы не хотите, чтобы сообщения о конвертации засоряли логи:

dos2unix -q filename.txt

8. Конвертация в окончания строк Mac (только CR)

Хотя сегодня это редко требуется, вы можете конвертировать файл в классический формат Mac OS 9 (только возврат каретки, r), используя флаг режима конвертации -c:

dos2unix -c mac filename.txt

9. Обратная конвертация из Unix в формат DOS

dos2unix поставляется вместе с unix2dos, которая выполняет обратную операцию — добавляет окончания CRLF для совместимости с Windows:

unix2dos filename.txt

10. Удаление метки порядка байт (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.conf

dos2unix в сравнении с альтернативными методами

Хотя 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
Рекурсивно конвертировать все файлы .shfind . -name "*.sh" -exec dos2unix {} ;
Сохранить исходную временную меткуdos2unix -k filename.txt
Тихий режим (без вывода)dos2unix -q filename.txt
Удалить BOMdos2unix -r filename.txt
Конвертировать в формат Macdos2unix -c mac filename.txt
Обратная конвертация: Unix в DOSunix2dos filename.txt
Проверить окончания строкfile filename.txt или cat -A filename.txt

Заключение

Команда dos2unix — это небольшая утилита с огромным влиянием на кросс-платформенную разработку и администрирование серверов. Скрытые символы r являются одной из наиболее распространённых причин ошибок типа «работает на моей машине», когда файлы перемещаются между средами Windows и Linux — и dos2unix устраняет их чисто, безопасно и эффективно.

Освоив синтаксис и параметры, вы сможете предотвращать сбои при развёртывании, обеспечивать совместимость скриптов и поддерживать целостность файлов конфигурации во всей вашей инфраструктуре. Независимо от того, являетесь ли вы разработчиком, отправляющим код на Linux-сервер, системным администратором, управляющим парком машин, или владельцем сайта, загружающим файлы в хостинговую среду, включение dos2unix в стандартный набор инструментов — это простая передовая практика, которая окупается каждый раз, когда файлы пересекают границы операционных систем.

15%

Сэкономьте 15% на всех хостинговых услугах

Проверьте свои навыки и получите скидку на любой тарифный план

Используйте код:

Skills
Начать