Подтвердить что ты не робот

Новые строки Unix для новых строк Windows (в Windows)

Кто-нибудь знает способ (скажем, Powershell или инструмент) в Windows, который может переписывать через каталог и конвертировать любые файлы unix в файлы Windows.

Я был бы очень доволен тем, как Powershell мог обнаружить файл unix.

Легко сделать это для одного файла, но я за чем-то более масштабируемым (следовательно, склоняюсь к решению Powershellish).

4b9b3361

Ответ 1

Вот вам чистый способ PowerShell, если вы заинтересованы.

Поиск файлов по крайней мере с одной строкой UNIX (PowerShell v1):

dir * -inc *.txt | %{ if (gc $_.FullName -delim "`0" | Select-String "[^`r]`n") {$_} }

Вот как вы находите и скрываете окончание строк UNIX до окончаний строки Windows. Важно отметить, что добавление дополнительной строки (\ r\n) будет добавлено в конец файла, если в конце нет строки, заканчивающейся в конце. Если вы действительно этого не хотите, я отправлю пример того, как вы можете его избежать (это немного сложнее).

Get-ChildItem * -Include *.txt | ForEach-Object {
    ## If contains UNIX line endings, replace with Windows line endings
    if (Get-Content $_.FullName -Delimiter "`0" | Select-String "[^`r]`n")
    {
        $content = Get-Content $_.FullName
        $content | Set-Content $_.FullName
    }
}

Вышеупомянутое работает, потому что PowerShell автоматически разбивает содержимое на \n (отбрасывает\r, если они существуют), а затем добавляет \r\n, когда он записывает в файл каждую вещь (в данном случае строку). Вот почему вы всегда заканчиваете строку, заканчивающуюся в конце файла.

Кроме того, я написал вышеприведенный код, чтобы он только изменял файлы, которые ему нужны. Если вам все равно, вы можете удалить оператор if. О, убедитесь, что только файлы попадают в объект ForEach. Помимо этого вы можете сделать любую фильтрацию, которую вы хотите в начале этого конвейера.

Ответ 2

Есть dos2unix и unix2dos в Cygwin.

Ответ 3

Кажется, это работает для меня.

Get-Content Unix.txt | Out-File Dos.txt

Ответ 4

скачать vim, откройте файл и выпустите

:se fileformat=dos|up

Пакет для нескольких файлов (все *.txt файлы в C:\tmp - рекурсивные):

:args C:\tmp\**\*.txt
:argdo se fileformat=dos|up

Ответ 5

Вы можете использовать Visual Studio. Файл → Расширенные параметры сохранения...

Ответ 6

Если Cygwin не для вас, существует множество автономных исполняемых файлов для unix2dos под Windows, если вы используете Google, или можете написать его сами, см. мой вопрос (обратное направление для преобразования) .

Ответ 7

Я провел 6 часов вчера и сегодня тестировал код, приведенный выше, в цикле с 10 000 файлами, многие из которых размером > 50 КБ. Внизу, код powershell очень неэффективен/медленный/непригодный для больших файлов и большого количества файлов. Он также не сохраняет байты спецификации. Я нашел unix2dos 7.2.3 самым быстрым и практичным решением. Надейтесь, что это помогает другим и экономит время.

Ответ 8

Открытие файла с окончанием строки Unix в Wordpad и сохранение его приведет к переписыванию всех окончаний строки в виде DOS. Немного трудоемкий для большого количества файлов, но он работает достаточно хорошо для нескольких файлов раз в то время.

Ответ 9

visual studio - расширенные варианты сохранения - это лучший (простой и эффективный) вариант, специально предназначенный для работы с большими файлами. Notepad ++ cant обрабатывает файлы порядка 50 МБ

Ответ 10

Как насчет этого (с отрицательным "взглядом позади"). Без -nonewline set-content помещает дополнительный 'r' n внизу. С помощью скобок вы можете изменить тот же файл. Это должно быть безопасно при случайном выполнении одного и того же файла.

function unix2dos ($infile, $outfile) {
    (Get-Content -raw $infile) -replace "(?<!'r)'n","'r'n" | 
    set-content -nonewline $outfile
}

Обратное было бы, окна для Unix текста.

function dos2unix ($infile, $outfile) {
    (Get-Content -raw $infile) -replace "'r'n","'n" | 
    set-content -nonewline $outfile
}

Примеры (входной и выходной файлы могут быть одинаковыми):

dos2unix dos.txt unix.txt
unix2dos unix.txt dos.txt
unix2dos file.txt file.txt

Если у вас есть emacs, вы можете проверить его с помощью esc-x hexl-mode. Блокнот не будет правильно отображать текст Unix; все будет на одной линии. Я должен указать путь для set-content, потому что -replace стирает свойство pspath.

Ответ 11

Меня устраивает:

 Get-ChildItem -Recurse -File | % { $tmp = Get-Content $_; $tmp | Out-File "$_" -Encoding UTF8 }