2009-04-07 9 views
24

Windows上でディレクトリを再帰的に処理し、すべてのunixファイルをWindowsファイルに変換できる方法(Powershellまたはツール)を知っている人はいますか?Windowsの改行(Windowsの場合)

少なくとも私はUnixファイルを検出するためにPowershellの方法に満足しています。

1つのファイルに対してこれを行うのは簡単ですが、私はもう少し拡張性のあるものを取っています(したがって、Powershellishのソリューションに傾いています)。

+1

http://スーパーユーザー。com/questions/27060/batch-convert-files-for-encoding-or-line-ending-under-windows/ –

+0

git repoの失敗のためにこれを行う必要があると思っている人のために、そうでないかもしれません。 gitでこの問題を他の方法で修正することは可能です:http://stackoverflow.com/questions/1510798/trying-to-fix-line-endings-with-git-filter-branch-but-having-no- luck/1511273#1511273 –

答えて

28

ここでは、興味のある純粋なPowerShellの方法です。エンディング少なくとも1つのUNIXライン(PowerShellのV1)と

検索ファイル:

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

あなたが見つけると、Windowsの行末に隠れたUNIXの改行方法です。注意すべき点の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は自動的に(それらが存在する場合は、\ rを落とす)\ nに内容を分割し、その後、\ rを\を追加​​nは、各事を書き込むとなりますので、(この場合はライン)ファイルへ。それで、あなたはいつもファイルの最後に終わる行で終わるのです。

また、私は上記のコードを書いて、必要なファイルのみを変更するようにしました。気にしない場合はif文を削除できます。ああ、ファイルだけがForEach-Objectに到達するようにしてください。それ以外に、パイプラインの開始時に必要なフィルタリングを行うことができます。

+0

これはASCIIファイルのASCIIエンコーディングを維持しますか? ... –

+1

デフォルトでは、PowerShellは "Unicode"で動作します。私はテキストエンコーディングの専門家ではありませんが、まだデフォルトに問題はありません。必要に応じて、-Encodingパラメーターを使用して、Get-ContentコマンドとSet-Contentコマンドのエンコードを明示的に設定することができます。 Get-Help Get-Content -Parameter Encoding – JasonMArcher

+0

@PeterSeale Set-ContentまたはOut-Fileには、ファイルのエンコードタイプを設定するための-Encodingパラメータがあります。 –

13

Cygwinにdos2unixとunix2dosがあります。

+2

このテクニックは、UNIXのutilsが元のファイルエンコーディング(UTF-8、ASCIIなど)を維持しているため、推奨します。 ASCIIファイルをASCII形式にすることを意図していた私は過去にPSに問題がありました。 –

+0

またはmsysを実行してから、cmdのユーティリティを使用できます。 – Pod

+2

私はファイルを一覧表示するためにpowershellを使い、それを以下のようにdos2unix.exeにパイプします: 'dir -Recurse -File -Exclude .git |あなたがすでにunixコマンドdos2unixを使っているならば、%{dos2unix --u2d --skipbin $ _} ' – orad

1

Cygwinがあなたのためでない場合、Windowsの下でunix2dosのための多くのスタンドアロンの実行可能ファイルがあります。あなた自身を書くことができます。私の同様の(変換の反対方向)質問hereを見てください。

6

ダウンロードvim、複数のファイルに対して、ファイルや問題

:se fileformat=dos|up 

バッチ(C内のすべての* .txtファイル:\ tmpに - 再帰的に):オープン

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

これをフォルダやバッチジョブとして実行できますか? – ninesided

+0

Eclipseをダウンロードし、ファイルを開き、ラインデリメータをUnixに変換します。 vimは間違いなく素晴らしいツールであり、私は毎日使っています。しかし、endoflineの変換には多少の過剰使用があるとは思いませんか? –

+3

それは私の心に来たちょうど最初のものです、それは私が所有/管理するすべてのボックスにあります。 Btw:vim(8.5MB)を使用する代わりに、eclipse(85MB)を使用してファイル単位でファイルを作成し、一度に実行することを実際に提案していますか? – soulmerge

2

あなたは、Visual Studioを使用することができます。ファイル - >詳細な保存オプション...

0

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

1

私は昨日、今日、上記のコードを10,000ファイルのループでテストしました。それらの多くは> 50kbです。要するに、大規模なファイルや多数のファイルに対して、PowerShellコードは非常に非効率的/遅い/使用不可能です。また、BOMバイトは保持されません。私はunix2dos 7.2.3が最も速く実用的な解決策であることを発見しました。これが他の人を助け、時間を節約することを願っています。

+0

これは、特に大きなファイルの場合、Get-Contentが非常に遅く(非効率的である)という事実と関係しています。 – bluuf

5

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

Get-Content Unix.txt | Out-File Dos.txt 
関連する問題