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. Shell не може знайти інтерпретатор, оскільки рядок 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 у директорії
Використовуйте підстановочні знаки shell або 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 до вашого стандартного набору інструментів є простою найкращою практикою, яка приносить дивіденди щоразу, коли файли перетинають межі операційних систем.
