Frage

Kennt jemand eine Möglichkeit, (sagen Powershell oder ein Werkzeug) in Windows, die ein Verzeichnis und konvertieren alle Unix-Dateien in Windows-Dateien Rekursion über können.

Ich würde vollkommen glücklich sein mit einer Art und Weise in Powershell dest eine Unix-Datei zu erkennen.

Es ist einfach, dies zu tun für eine einzelne Datei, aber ich bin nach etwas ein bisschen besser skalierbar (also in Richtung einer Powershellish Lösung lehnt).

War es hilfreich?

Lösung

Hier ist die reine Powershell Art und Weise, wenn Sie interessiert sind.

Die Suche nach Dateien mit atleast eines UNIX-Zeilenende (Powershell v1):

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

Hier ist, wie Sie finden und verdeckte UNIX-Zeilenende auf Windows-Zeilenende. Eine wichtige Sache zu beachten ist, dass ein zusätzlicher Zeilenende (\ r \ n) wird an das Ende der Datei hinzugefügt werden, wenn ist es nicht bereits eine Zeile am Ende endet. Wenn Sie wirklich, dass Sie nicht wollen, ich werde ein Beispiel hinterlassen, wie Sie es vermeiden kann (es ist ein wenig komplexer ist).

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
    }
}

Die oben genannten Arbeiten, weil Powershell automatisch den Inhalt auf \ n geteilt (dropping \ r falls vorhanden) und fügen Sie dann \ r \ n, wenn es schreibt jedes Ding (in diesem Fall eine Zeile) in die Datei. Deshalb sollten Sie immer mit einer Zeile am Ende der Datei mit der Endung enden.

Auch schrieb ich den obigen Code, so dass es nur Dateien modifiziert, die es braucht. Wenn Sie nicht über Sie darauf, dass Sie die if-Anweisung entfernen. Oh, stellen Sie sicher, dass nur Dateien auf dem ForEach-Object erhalten. Anders als das Sie tun können, was das Filtern Sie dieser Pipeline zu Beginn wollen.

Andere Tipps

Es gibt dos2unix und unix2dos in Cygwin .

Das scheint für mich zu arbeiten.

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

vim , öffnen Sie Ihre Datei und Ausgabe

:se fileformat=dos|up

Batch für mehrere Dateien (alle * .txt-Dateien in C: \ tmp - rekursiv):

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

Sie können Visual Studio verwenden. Datei -> Erweiterte Optionen speichern ...

Wenn Cygwin ist nicht für Sie, gibt es zahlreiche eigenständige ausführbare Dateien für unix2dos unter Windows, wenn Sie rund um Google, oder könnten Sie selbst eine Beurteilung schreiben, sehen meine ähnliche (entgegengesetzte Richtung zur Umwandlung) Frage here .

Ich verbrachte 6 Stunden gestern und heute den Code oben in einer Schleife mit 10.000 Dateien, viele von ihnen> 50kb in Größe gegeben zu testen. Unterm Strich, der Powershell-Code ist sehr ineffizient / langsam / unbrauchbar für große Dateien und große Anzahl von Dateien. Es ist auch nicht bewahren BOM Bytes. Ich fand unix2dos 7.2.3 die schnellste und praktischste Lösung. Hoffe, das hilft anderen und spart ihnen Zeit.

Öffnen einer Datei mit Unix-Zeilenenden in Wordpad und speichern es werden alle Zeilenenden als DOS neu schreiben. Ein bisschen umständlich für eine große Anzahl von Dateien, aber es für ein paar Dateien funktioniert gut genug jeder einmal in einer Weile.

Es funktioniert für mich:

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

Wie wäre es damit (mit negativen Lookbehind). Ohne -nonewline, Set-Inhalt stellt einen zusätzlichen `r`n an der Unterseite. Mit den Klammern, können Sie die gleiche Datei ändern.

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

Die Rückseite würde dies, Fenster in der Unix-Text sein.

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

Beispiele:

unix2dos file.txt
dos2unix file.txt

Wenn Sie Emacs haben, können Sie es überprüfen mit esc-x HexL-Modus. Notepad wird nicht Unix Text richtig angezeigt. Ich habe, um den Pfad für Set-Inhalt angeben, weil -replace die PSPath löscht.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top