Вопрос

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

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

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

Это было полезно?

Решение

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

Поиск файлов, заканчивающихся хотя бы одной строкой UNIX (PowerShell v1):

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

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

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 при записи каждого элемента (в данном случае строки) в файл.Вот почему вы всегда получаете строку, заканчивающуюся в конце файла.

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

Другие советы

В dos2unix и unix2dos есть Сигвин.

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

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

Скачать vim, откройте ваш файл и выдайте

:se fileformat=dos|up

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

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

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

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

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

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

У меня это работает:

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

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

function unix2dos {
    (Get-Content -raw $args[0]) -replace "(?<!`r)`n","`r`n" | 
    set-content -nonewline $args[0]
}

Обратным было бы следующее: текст из Windows в unix.

function dos2unix {
    (Get-Content -raw $args[0]) -replace "`r`n","`n" | 
    set-content -nonewline $args[0]
}

Примеры:

unix2dos file.txt
dos2unix file.txt

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top