15%

Спести 15% на всички хостинг услуги

Тествай уменията си и получи Отстъпка за всеки хостинг план

Използвайте код:

Skills
За начало
24.10.2024
2 +1

Linux команда `dos2unix`: Премахване на скрити Windows символи от файлове

Когато прехвърляте текстови файлове между Windows и Linux системи, невидими символи за форматиране могат безшумно да повредят вашите скриптове, конфигурационни файлове и конвейери за данни. Основната причина е фундаментална разлика в начина, по който всяка операционна система маркира края на ред: Windows използва последователност carriage return + line feed (rn, известна още като CRLF), докато Linux очаква само line feed (n, или LF). Този допълнителен символ r — невидим в повечето редактори — може да причини неуспех на шел скриптове с криптични грешки, да наруши конфигурационните парсери и да произведе неочакван изход в инструменти за обработка на текст като 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 редът съдържа скрит carriage return. По същия начин, Python скриптове, cron задачи, .env файлове и конфигурационни файлове на Nginx или Apache могат да се държат непредвидимо, когато съдържат Windows окончания на редове.

Това е особено критично в сървърни среди. Ако управлявате среда за VPS Хостинг или Dedicated сървър, разполагането на неправилно конфигурирани скриптове или повредени конфигурационни файлове може да спре услугите. Знанието как да откривате и поправяте проблеми с окончанията на редове е основно умение за системен администратор.

Как да инсталирате 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Запазва Byte Order Mark (BOM), ако е налице
-r--remove-bomПремахва Byte Order Mark (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 файлове в директория

Използвайте шел глобиране или find за обработка на цели директории:

dos2unix *.txt

Или рекурсивно в поддиректории:

find /path/to/directory -type f -name "*.txt" -exec dos2unix {} ;

Това е особено полезно при разполагане на файлове на уеб приложения или конфигурационни набори, пакетирани на Windows машина.

5. Рекурсивно конвертиране на всички шел скриптове

Честа задача за системен администратор — поправяне на всички Bash скриптове в директория на проект:

find /var/www/myapp -type f -name "*.sh" -exec dos2unix {} ;

6. Запазване на оригиналния времеви печат на файла

По подразбиране dos2unix актуализира времето на промяна на файла. За да запазите оригиналния времеви печат (полезно в конвейери за разполагане или когато make разчита на времеви печати):

dos2unix -k filename.txt

7. Тих режим — потискане на целия изход

Идеален за използване в шел скриптове и автоматизация, където не искате съобщенията за конвертиране да претрупват логовете:

dos2unix -q filename.txt

8. Конвертиране към Mac окончания на редове (само CR)

Макар рядко необходимо днес, можете да конвертирате файл към класически Mac OS 9 формат (само carriage return, r) с флага за режим на конвертиране -c:

dos2unix -c mac filename.txt

9. Конвертиране от Unix обратно към DOS формат

dos2unix се доставя заедно с unix2dos, който извършва обратната операция — добавяне на CRLF окончания за съвместимост с Windows:

unix2dos filename.txt

10. Премахване на Byte Order Mark (BOM)

Файлове, запазени от Windows приложения, понякога включват UTF-8 BOM в началото, което може да наруши скриптовете и парсерите на Linux. Премахнете го с:

dos2unix -r filename.txt

Използване на dos2unix в шел скриптове и автоматизация

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 хедъри, причинявайки неуспехи на сесии и бисквитки. Python WSGI приложения могат да хвърлят синтактични грешки. Конфигурационни файлове на Nginx и Apache със скрити символи r могат да попречат на услугите да стартират изобщо.

Ако хоствате уебсайтове или приложения на план за Споделен уеб хостинг или управлявате собствен VPS с cPanel, включването на dos2unix в работния ви процес за качване и разполагане на файлове е проста, високостойностна практика. За екипи, изпълняващи автоматизирани разполагания на Dedicated сървъри, добавянето на 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
Премахване на BOMdos2unix -r filename.txt
Конвертиране към Mac форматdos2unix -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
За начало