ディレクトリを再帰的に処理し、Unix ファイルを Windows ファイルに変換できる Windows の方法 (PowerShell やツールなど) はありますか。
PowerShell で少なくとも Unix ファイルを検出する方法があれば、まったく問題ありません。
1 つのファイルに対してこれを行うのは簡単ですが、もう少しスケーラブルなものを求めています (したがって、PowerShellish ソリューションに傾倒しています)。
ディレクトリを再帰的に処理し、Unix ファイルを Windows ファイルに変換できる Windows の方法 (PowerShell やツールなど) はありますか。
PowerShell で少なくとも Unix ファイルを検出する方法があれば、まったく問題ありません。
1 つのファイルに対してこれを行うのは簡単ですが、もう少しスケーラブルなものを求めています (したがって、PowerShellish ソリューションに傾倒しています)。
興味がある場合は、これが純粋なPowerShellの方法です。
少なくとも1つのUnix行で終わるファイルの検索(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に到達することを確認してください。それ以外は、そのパイプラインの開始時に必要なフィルタリングを実行できます。
Cygwinには dos2unix と unix2dos があります。
これは私にはうまくいくようです。
Get-Content Unix.txt | Out-File Dos.txt
Vimをダウンロードし、ファイルを開き、発行します。
:se fileformat=dos|up
複数のファイルのバッチ (C:\tmp 内のすべての *.txt ファイル - 再帰的):
:args C:\tmp\**\*.txt
:argdo se fileformat=dos|up
Visual Studioを使用できます。メニューファイル→高度な保存オプション... .
前の回答で与えられたコードを 10,000 ファイルのループでテストした結果、その多くはサイズが 50 KB を超えています。
要するに、PowerShell コードは、大きなファイルや多数のファイルに対して非常に効率が悪い/遅い/使用できないということです。また、BOMバイトも保持されません。unix2dos 7.2.3 が最速で最も実用的なソリューションであることがわかりました。