Як групово перетворити весь файл у відділення файлової системи між форматом розриву рядків Unix та Windows?


14

Всім відомо :-), що в Windows звичайні текстові файли рядки закінчуються CR + LF, а в Unix & Linux - лише LF. Як я можу швидко конвертувати всі файли вихідного коду з одного формату в інший і назад?

Відповіді:


17

Це залежить: якщо файли знаходяться під контролем версій, це може бути досить непопулярним рішенням, що забруднює історію. У Git є можливість автоматичного перетворення закінчень рядків під час виїзду.

Якщо вам все одно і хочете швидко конвертувати, є такі програми, як fromdos/ todosі dos2unix/, unix2dosякі роблять це за вас. Ви можете використовувати find: find . -type f -name '*.php' -exec dos2unix '{}' +.


7

Є кілька виділених програм, в тому числі

  • dos2unixта unix2dosз інструментів dos2unix
  • todosі fromdosз інструментів tofrodos

Просто виберіть інструмент у відповідному напрямку та передайте імена файлів для конвертування у командному рядку.


Якщо у вас немає жодного, але у вас є Linux або Cygwin:

sed -i -e 's/\r\+$//' filename             # dos|unix -> unix
sed -i -e 's/\r*$/\r/' filename            # dos|unix -> dos

Якщо у вас є Perl:

perl -i -pe 's/\r+$//' filename            # dos|unix -> unix
perl -i -pe 's/\r*$/\r/' filename          # dos|unix -> dos

Маючи лише інструменти POSIX (включаючи BusyBox), щоб перейти від unix до dos, вам потрібно буде передати символ CR буквально в команді sed.

cr=$(echo | tr '\n' '\r')
sed -e "s/$cr*\$/$cr/" <filename >filename.dos
mv filename.dos filename

В іншому напрямку ви можете просто видалити всі КР:

tr -d '\r' <filename >filename.dos
mv filename.dos filename

Ви можете використовувати символи для перетворення одразу багатьох файлів у одному каталозі, наприклад

sed -i -e 's/\r\+$//' *.txt

Для перетворення всіх файлів у поточному каталозі та його підкаталогах, якщо ваша оболонка zsh, ви можете використовувати **/, наприклад,

sed -i -e 's/\r\+$//' **/*.txt

Ви можете використовувати **/в bash ≥4, але вам потрібно запустити shopt -s globstarперший (ви можете помістити цей рядок у свій ~/.bashrc). Ви можете використовувати **/в ksh93, але вам потрібно запустити set -o globstarспочатку (ви можете помістити цей рядок у свій ~/.kshrc.

Якщо ви можете використовувати лише інструменти, які потребують перенаправлення, використовуйте forцикл.

for x in *.txt; do
  tr -d '\r' <"$x" >"$x.dos"
  mv -- "$x.dos" "$x"
done

Якщо у вас немає **/або потрібна більш складна відповідність для вибору файлів для конвертування, скористайтеся findкомандою. Ось приклад Linux / Cygwin, який конвертує всі файли в поточному каталозі та його підкаталогах рекурсивно, за винятком файлів, що називаються .oта під назвами підкаталогів bin.

find -name 'bin' -type d -prune -o \
     \! -name '*.o' \
     -exec sed -i -e 's/\r\+$//' {} +

Ось приклад POSIX. Ми кажемо findзапустити оболонку, яка може виконати необхідне перенаправлення.

find -name 'bin' -type d -prune -o \
     \! -name '*.o' \
     -exec sh -c '
       tr -d '\r' <"$0" >"$0.dos"
       mv -- "$0.dos" "$0"
' {} \;

Ви можете зробити findметод трохи швидше, за рахунок більш складного коду, використовуючи цикл у команді shell.

find -name 'bin' -type d -prune -o \
     \! -name '*.o' \
     -exec sh -c '
       for x; do
         tr -d '\r' <"$x" >"$x.dos"
         mv -- "$x.dos" "$x"
       done
' _ {} +

2

wincp також автоматично перетвориться, якщо це буде сказано .

Якщо ваші файли містяться в одному каталозі:

DIRECTORY=/your/directory
unix2dos $DIRECTORY/*

Чи можете ви, будь ласка, описати трохи більше, як це досягти через WinSCP?
harish sharma

@harishsharma Я додав посилання на обов язок "сказано так".
Нілс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.