web-dev-qa-db-ja.com

Unix改行からWindows改行(Windowsの場合)

ディレクトリ上で再帰し、UNIXファイルをWindowsファイルに変換できるWindowsの方法(Powershellやツールなど)を知っている人はいますか?.

少なくともunixファイルを検出するPowershellの方法に完全に満足しています。

1つのファイルに対してこれを行うのは簡単ですが、私はもう少しスケーラブルなものを求めています(したがって、Powershellishソリューションに傾いています)。

27
eddiegroves

興味がある場合は、これが純粋なPowerShellの方法です。

UNIX行が少なくとも1行で終わるファイルの検索(PowerShell v1):

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

UNIXの行末をWindowsの行末に変換する方法は次のとおりです。注意すべき重要な点の1つは、ファイルの最後に行末がない場合は、ファイルの最後に余分な行末(\ 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-Objectに到達することを確認してください。それ以外は、そのパイプラインの開始時に必要なフィルタリングを実行できます。

34
JasonMArcher

Cygwin にはdos2unixとunix2dosがあります。

13

これは私にとってはうまくいくようです。

Get-Content Unix.txt | Out-File Dos.txt
9
Keith G.

ダウンロード vim 、ファイルを開いて発行

:se fileformat=dos|up

複数のファイルのバッチ(C:\ tmp内のすべての* .txtファイル-再帰的):

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

VisualStudioを使用できます。ファイル->詳細保存オプション...

2
i_am_jorf

Cygwinが適切でない場合、Googleを使用している場合、または自分で作成できる場合は、Windowsでunix2dos用のスタンドアロン実行可能ファイルが多数あります。同様の(変換の反対方向)質問 ここ を参照してください。

1
ninesided

私は昨日6時間過ごしましたが、今日は10,000個のファイルを含むループで上記のコードをテストしました。ファイルの多くはサイズが50kbを超えています。結論として、PowerShellコードは、大きなファイルや多数のファイルに対して非常に非効率的/低速/使用できません。また、BOMバイトは保持されません。 unix2dos7.2.3が最速で最も実用的なソリューションであることがわかりました。これが他の人を助け、時間を節約することを願っています。

1
Arvind

わたしにはできる:

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

これはどうですか(ネガティブな後ろ姿で)。 -nonewlineがない場合、set-contentは下部に余分な `r`nを置きます。括弧を使用すると、同じファイルを変更できます。

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-xhexl-modeで確認できます。メモ帳はUNIXテキストを正しく表示しません。 -replaceはpspathを消去するため、set-contentのパスを指定する必要があります。

0
js2010

ワードパッドでUnixの行末のあるファイルを開いて保存すると、すべての行末がDOSとして書き換えられます。多数のファイルに対しては少し面倒ですが、たまにいくつかのファイルに対しては十分に機能します。

0
jdmichal